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.
|
|