Du bist nicht eingeloggt.

Login

Pass

Registrieren

Community
Szene & News
Locations
Impressum

Forum / Bits und Bytes

Datentyp Int (Inc/c++)

LatinBaby - 37
Halbprofi (offline)

Dabei seit 06.2008
140 Beiträge
Geschrieben am: 10.09.2010 um 23:12 Uhr

Hi, ich hab da mal zwei kurze Fragen

Und zwar soll der Int sich ja an der Wortbreite der CPU orientieren, was bedeutet, dass Ints auf verschiedenen PCs, verschiedene Größen haben.

Jetzt habe ich einen Dual Core (und ich glaube die sind immer 64 bit (sorry, kenne mich da nicht so aus)), aber dennoch habe ich mit INT_MAX einen 32bit Wert zurück bekommen.

Und die zweite Frage wäre, ob man einen Int irgendwie auf eine feste Größe definieren kann, wie es bei Java z.B. schon automatisch der Fall wird...

Ich hab zwar auf dem englischen Wiki was gefunden, bin jedoch noch nicht so ganz fit darin und es wird auch zu oft von 32bit Ints und dazu noch Zeigern gesprochen.

Danke
Phalycs - 36
Halbprofi (offline)

Dabei seit 08.2005
104 Beiträge
Geschrieben am: 10.09.2010 um 23:17 Uhr

zur ersten Frage: verwendest du ein 64bit Betriebssystem?
Falls nein, wird auch ein 64bit Prozessor nur mit 32bit betrieben.

zur zweiten Frage kann ich leider nichts sagen, da ich mich mit c++ nicht auskenne.
LatinBaby - 37
Halbprofi (offline)

Dabei seit 06.2008
140 Beiträge
Geschrieben am: 10.09.2010 um 23:19 Uhr

Ja, ich habe Windows 7 (Also natürlich die 64bit Version)
warlock - 38
Profi (offline)

Dabei seit 11.2005
446 Beiträge

Geschrieben am: 10.09.2010 um 23:21 Uhr

wie in der pn schon erwähnt
hat int in c++ nur die 2^32 form

Kaffee ohne Koffein ist wie seine Schwester zu lecken. Schmeckt richtig, ist aber falsch.

markwithak
Anfänger (offline)

Dabei seit 08.2009
17 Beiträge
Geschrieben am: 10.09.2010 um 23:39 Uhr

es gibt in cpp zwar n long, allerdings ist er genauso groß wie der normale int, aber du kannst ja eig alles mit sizeof ausgeben.
Klischeepunk - 41
Champion (offline)

Dabei seit 01.2005
8907 Beiträge

Geschrieben am: 11.09.2010 um 00:24 Uhr
Zuletzt editiert am: 11.09.2010 um 01:05 Uhr

MSDN helps
und nochmal

Der Wohl wichtigste Satz zu den Data Type Constants:
"The constants listed below give the ranges for the integral data types and are defined in LIMITS.H" (gilt für jedes System/compiler)
also siehe dort wie INT_MAX definiert ist. Generell ist alles "CAPS" geschriebene ein define der irgendwo irgendeinen wert erhält, einfach mal nach der Definition suchen.
/e: Zur 32 Bit einschränkung in c++ wie von warlock angegeben find ich nix. Quelle?

Sieht definitiv falsch aus (hätte mich auch sehr gewundert):

klick

Zitat:


* The values of the columns Size and Range depend on the system the program is compiled for. The values shown above are those found on most 32-bit systems. But for other systems, the general specification is that int has the natural size suggested by the system architecture (one "word") and the four integer types char, short, int and long must each one be at least as large as the one preceding it, with char being always one byte in size. The same applies to the floating point types float, double and long double, where each one must provide at least as much precision as the preceding one.


Dieser Post wurde 2 mal ROT-13 verschlüsselt.

Rifleman - 40
Experte (offline)

Dabei seit 09.2003
1540 Beiträge
Geschrieben am: 11.09.2010 um 04:54 Uhr

Meine glibc (2.11.2) sagt dazu folgendes:

Zitat:

/* Minimum and maximum values a `signed int' can hold. */
# define INT_MIN (-INT_MAX - 1)
# define INT_MAX 2147483647

/* Maximum value an `unsigned int' can hold. (Minimum is 0.) */
# define UINT_MAX 4294967295U

/* Minimum and maximum values a `signed long int' can hold. */
# if __WORDSIZE == 64
# define LONG_MAX 9223372036854775807L
# else
# define LONG_MAX 2147483647L
# endif
# define LONG_MIN (-LONG_MAX - 1L)

Verschiedene Compiler machen hier wohl verschiedene Sachen...
Falls es der gcc ist sind vielleicht die Typen aus der stdint.h besser:

Zitat:

#ifndef __int8_t_defined
# define __int8_t_defined
typedef signed char int8_t;
typedef short int int16_t;
typedef int int32_t;
# if __WORDSIZE == 64
typedef long int int64_t;
# else
__extension__
typedef long long int int64_t;
# endif
#endif


Es sind die kleinen Dinge, die einen zum Wahnsinn treiben.

Klischeepunk - 41
Champion (offline)

Dabei seit 01.2005
8907 Beiträge

Geschrieben am: 11.09.2010 um 13:29 Uhr

Zitat von Rifleman:

Meine glibc (2.11.2) sagt dazu folgendes:

Zitat:

/* Minimum and maximum values a `signed int' can hold. */
# define INT_MIN (-INT_MAX - 1)
# define INT_MAX 2147483647

/* Maximum value an `unsigned int' can hold. (Minimum is 0.) */
# define UINT_MAX 4294967295U

/* Minimum and maximum values a `signed long int' can hold. */
# if __WORDSIZE == 64
# define LONG_MAX 9223372036854775807L
# else
# define LONG_MAX 2147483647L
# endif
# define LONG_MIN (-LONG_MAX - 1L)

Verschiedene Compiler machen hier wohl verschiedene Sachen...
Falls es der gcc ist sind vielleicht die Typen aus der stdint.h besser:

Zitat:

#ifndef __int8_t_defined
# define __int8_t_defined
typedef signed char int8_t;
typedef short int int16_t;
typedef int int32_t;
# if __WORDSIZE == 64
typedef long int int64_t;
# else
__extension__
typedef long long int int64_t;
# endif
#endif

Definitiv, ja, damit umgehst du das Problem, INT_MAX ist halt n define - der bei dir ja auch als 2^32 angegeben wird, wohingegen dein int bereits 2^64 sein kann. Mit so definierten Typen hast du das was du willst.
Im MSVC gibts die INT<bit> Defines, wobei hier afaik teils auch einfach ein typedef int INT; gemacht wird also nichts gewonnen ist.

Dieser Post wurde 2 mal ROT-13 verschlüsselt.

Rifleman - 40
Experte (offline)

Dabei seit 09.2003
1540 Beiträge
Geschrieben am: 11.09.2010 um 15:27 Uhr

Zitat von Klischeepunk:

Definitiv, ja, damit umgehst du das Problem, INT_MAX ist halt n define - der bei dir ja auch als 2^32 angegeben wird, wohingegen dein int bereits 2^64 sein kann.

Dann hätte ich aber keine vernünftige C-Umgebung mehr...
Es sieht wohl so aus, dass der Standard für diese Typen lediglich Mindestgrößen fordert:

Zitat:

"Sizes of integral types <limits.h>"

The values given below shall be replaced by constant expressions
suitable for use in #if preprocessing directives. Their
implementation-defined values shall be equal or greater in magnitude
(absolute value) to those shown, with the same sign.

Auf 64bit Unix ist long also wohl tatsächlch länger als auf Win, während int übereinstimmt.
Da das unter Umständen zu Problemen führen kann gibts die stdint.h, die Teil von C99 ist, dann aber nicht auf jedem System zur Verfügung steht...
Standards sind was tolles ;-)

Es sind die kleinen Dinge, die einen zum Wahnsinn treiben.

  [Antwort schreiben]

Forum / Bits und Bytes

(c) 1999 - 2026 team-ulm.de - all rights reserved - hosted by ibTEC Team-Ulm

- Presse - Blog - Historie - Partner - Nutzungsbedingungen - Datenschutzerklärung - Jugendschutz -