Ich versuche, 64-Bit-Ganzzahlen in C zu verwenden, erhalte aber gemischte Signale, ob dies möglich sein sollte.
Wenn ich das printf ausführe:
printf("Size of long int:%d\nSize of long long int:%d\n\n",(int)sizeof(long int), (int)sizeof(long long int));
Die Antwort, die ich bekomme, ist:
Größe von long int:4 Größe von long long int:8
Dies gibt mir das Gefühl, dass ein Long Long Int 8 Bytes = 64 Bits hat.
Wenn ich jedoch versuche, die folgenden Variablen zu deklarieren:
long long int a2 = 0x00004444;
long long int b2 = 0x000044440;
long long int c2 = 0x0000444400;
long long int d2 = 0x00004444000;
long long int e2 = 0x000044440000;
long long int f2 = 0x0000444400004;
long long int g2 = 0x00004444000044;
long long int h2 = 0x000044440000444;
long long int i2 = 0x0000444400004444;
Die letzten 4 Variablen (f2,g2,h2,i2) geben mir die Fehlermeldung:
Warnung: Integer-Konstante ist zu groß für ‘langen’ Typ
Ich erhalte das gleiche Ergebnis, wenn ich „long long int“ durch „int64_t“ ersetze. Ich gehe davon aus, dass ‘int64_t’ erkannt wurde, da es keine eigenen Fehlermeldungen generiert hat.
Es scheint also, dass mein 8 Byte langer Long Int wirklich ein 6 Byte langer Long Int ist, und ich verstehe nicht, was mir hier fehlt. Wenn es hilft, hier sind die Informationen zu meinem gcc-Compiler:
me@ubuntu:~$ gcc -v
Using built-in specs.
Target: i686-linux-gnu
Configured with: ../src/configure -v
--with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5'
--with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs
--enable-languages=c,c++,fortran,objc,obj-c++
--prefix=/usr
--program-suffix=-4.4
--enable-shared
--enable-multiarch
--enable-linker-build-id
--with-system-zlib
--libexecdir=/usr/lib
--without-included-gettext
--enable-threads=posix
--with-gxx-include-dir=/usr/include/c++/4.4
--libdir=/usr/lib
--enable-nls
--with-sysroot=/ -
-enable-clocale=gnu
--enable-libstdcxx-debug
--enable-objc-gc
--enable-targets=all
--disable-werror
--with-arch-32=i686
--with-tune=generic
--enable-checking=release
--build=i686-linux-gnu
--host=i686-linux-gnu
--target=i686-linux-gnu
Thread model: posix
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)
Wenn jemand weiß, wie (oder ob) 64-Bit-Integer für mich zugänglich sind, würde ich mich über jede Hilfe freuen. Vielen Dank….
Als Alternative zum
LL
Suffix, Kompilieren mit-std=c99
sollte auch funktionieren. In C99 hat eine hexadezimale ganzzahlige Konstante einen Typlong long int
oderunsigned long long int
wenn es zu groß ist, um hineinzupassen(unsigned) long int
passt aber(unsigned) long long int
. Kein Suffix erforderlich.– Daniel Fischer
7. März 2012 um 17:59 Uhr
Ein Punkt, der hier erwähnt werden sollte, ist, dass das Problem nicht die long long int-Variablen sind
f2
zui2
, sondern die von Ihnen angegebenen Ganzzahlliterale. In C89 ist ein Integer-Literal ohne angegebenen Suffix vom Typint
wenn der gegebene Wert in diesen Typ passt, sonst hat er den Typlong int
. Das Problem ist, dass0x0000444400004
passt auch nicht in dieint
oder derlong int
type und darüber beschwert sich der Compiler. Die Zuweisung ist hier nicht das Problem, Sie weisen eine zulong int
zu einemlong long int
. Wie Daniel schreibt, löst c99 dies durch Zulassenlong long
Literale.– Sascha
19. Oktober 2016 um 20:30 Uhr
@DanielKamilKozar Das habe ich hinzugefügt.
– smWikipedia
28. Juni 2017 um 2:29 Uhr