So geben Sie 64-Bit-Ganzzahlen in c an

Lesezeit: 6 Minuten

Benutzeravatar von user1245262
Benutzer1245262

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 Typ long long int oder unsigned long long int wenn es zu groß ist, um hineinzupassen (unsigned) long intpasst 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 zu i2, sondern die von Ihnen angegebenen Ganzzahlliterale. In C89 ist ein Integer-Literal ohne angegebenen Suffix vom Typ int wenn der gegebene Wert in diesen Typ passt, sonst hat er den Typ long int. Das Problem ist, dass 0x0000444400004 passt auch nicht in die int oder der long int type und darüber beschwert sich der Compiler. Die Zuweisung ist hier nicht das Problem, Sie weisen eine zu long int zu einem long long int. Wie Daniel schreibt, löst c99 dies durch Zulassen long long Literale.

    – Sascha

    19. Oktober 2016 um 20:30 Uhr


  • @DanielKamilKozar Das habe ich hinzugefügt.

    – smWikipedia

    28. Juni 2017 um 2:29 Uhr

Benutzeravatar von Paul R
Paul R

Verwenden stdint.h für bestimmte Größen von Integer-Datentypen und verwenden Sie auch geeignete Suffixe für Integer-Literalkonstanten, z.

#include <stdint.h>

int64_t i2 = 0x0000444400004444LL;

  • int64_t ist sowohl robust als auch tragbar. long long int ist nicht.

    – PaulR

    7. März 2012 um 18:24 Uhr

  • In der Theorie, int64_t es ist optional. Jedoch, int_least64_t und long long int sind (ab C99) vom Standard vorgeschrieben und müssen mindestens 64 Bit (63 Wertbits + Vorzeichenbit) haben.

    – Daniel Fischer

    7. März 2012 um 19:12 Uhr

  • Ich kann sehen, dass long long int nicht robust ist, aber wie ist es nicht tragbar? Es sei denn, Sie meinen nicht portabel = vielleicht/vielleicht nicht 64 Bit. Verstehe ich richtig? Im Moment ist mein Eindruck immer und überall int64_t = 64 Bit. long long int = 64 Bit oder mehr, abhängig von Ihrer Implementierung von C.

    – Benutzer1245262

    7. März 2012 um 20:28 Uhr

  • Mit C99 long long int ist mindestens 64 Bit, also hängt es davon ab, wie portabel Sie sein möchten – wenn Sie C99 annehmen können, dann sind Sie in Ordnung. Aber für mich scheint es ein Kinderspiel zu sein, dass, wenn Sie eine explizite Größe benötigen, dies explizit ausgedrückt werden sollte – es kostet Sie nichts, es ist besser lesbar und selbsterklärend und tendenziell tragbarer.

    – PaulR

    8. März 2012 um 8:17 Uhr


  • @ doug65536 Verwenden INT64_C(0x0000444400004444) für eine Konstante mindestens 64-Bit. Die “passenden” Suffixe werden hinzugefügt.

    – chux – Wiedereinsetzung von Monica

    28. Juni 2017 um 11:44 Uhr

Benutzeravatar von Martin Beckett
Martin Beckett

Probieren Sie ein LL Suffix auf der Zahl, kann der Compiler sie als Teil der Analyse in einen Zwischentyp umwandeln. Sehen http://gcc.gnu.org/onlinedocs/gcc/Long-Long.html

long long int i2 = 0x0000444400004444LL;

Außerdem verwirft der Compiler die führenden Nullen, also 0x000044440000 wird 0x44440000was eine vollkommen akzeptable 32-Bit-Ganzzahl ist (weshalb Sie vorher keine Warnungen sehen f2).

Verwenden int64_tdieser tragbare C99-Code.

int64_t var = 0x0000444400004444LL;

Zum Drucken:

#define __STDC_FORMAT_MACROS
#include <inttypes.h>

printf("blabla %" PRIi64 " blabla\n", var);

  • Danke, das Suffix „LL“ scheint die einfachste funktionierende Lösung zu sein. Also muss ich jetzt herausfinden, wie viel der Zweck von int64_t für die Lesbarkeit ist und wie viel es ist, 64 Bit wirklich zu erzwingen.

    – Benutzer1245262

    7. März 2012 um 18:07 Uhr

  • @ user1245262, verwenden Sie int64_t, wenn Sie 64 Bit haben müssen – dh einige Datenfelder sind genau so lang. Verwenden Sie Long Long, wenn Sie mehr als Long brauchen – dann sind Sie auch nächstes Jahr noch auf der 256-Bit-Maschine ok!

    – Martin Beckett

    7. März 2012 um 18:11 Uhr

  • lang lang int ist wenigstens 64 Bit. int64_t ist exakt 64 Bit.

    – Karoly Horvath

    7. März 2012 um 18:34 Uhr

  • Danke … das ist der Unterschied, der für mich Sinn macht.

    – Benutzer1245262

    7. März 2012 um 19:04 Uhr

  • @KarolyHorvath C definiert zumindest keinen eingebauten Typ. Die einzige Anforderung ist sizeof(char)==1 und sizeof(long long)>=sizeof(long)>=sizeof(int)>=sizeof(char). Wenn Sie Ihre Plattform kennen, ist LL eine Lösung. Wenn Sie plattformübergreifenden Code benötigen, sollten Sie testen, ob long long mindestens 64-Bit ist.

    – NN_

    16. April 2019 um 16:38 Uhr

So geben Sie 64-Bit-Ganzzahlen in c an

Gegen die gehen üblich gute idee zum anhängen LL.

Anhängen LL zu einem ganzzahlige Konstante wird sicherstellen, dass der Typ mindestens so breit ist wie long long. Wenn die ganzzahlige Konstante oktal oder hexadezimal ist, wird die Konstante unsigned long long wenn benötigt.

Wenn man sich nicht darum kümmert, einen zu breiten Typ anzugeben, dann LL ist in Ordnung. ansonsten weiterlesen.

long long kann breiter als 64-Bit sein.

Heute ist das selten long long ist nicht 64-Bit, aber C spezifiziert long long sein wenigstens 64-Bit. Also durch Nutzung LLin der Zukunft kann der Code beispielsweise eine 128-Bit-Zahl angeben.

C hat Makros für ganzzahlige Konstanten was im folgenden Fall Typ sein wird int_least64_t

#include <stdint.h>
#include <inttypes.h>

int main(void) {
  int64_t big = INT64_C(9223372036854775807);
  printf("%" PRId64 "\n", big);
  uint64_t jenny = INT64_C(0x08675309) << 32;  // shift was done on at least 64-bit type 
  printf("0x%" PRIX64 "\n", jenny);
}

Ausgang

9223372036854775807
0x867530900000000

Hängen Sie ll-Suffix an Hexadezimalziffern für 64-Bit (long long int) oder volles Suffix für unsigned 64-Bit (unsigned long long) an.

1413360cookie-checkSo geben Sie 64-Bit-Ganzzahlen in c an

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy