如何在c中指定64位整数

我试图在C中使用64位整数,但得到混合信号,应该是可能的。

当我执行printf时:

printf("Size of long int:%d\nSize of long long int:%d\n\n",(int)sizeof(long int), (int)sizeof(long long int)); 

我得到的回应是:

long int的大小:4 long long int的大小:8

这让我觉得long long int有8个字节= 64位。

但是,当我尝试声明以下variables时:

 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; 

最后4个variables(f2,g2,h2,i2)给了我错误信息:

警告:整数常量对于“长”types来说太大

当我用'int64_t'replace'long long int'时,我得到相同的结果。 我假设'int64_t'被识别,因为它没有产生任何错误信息。

所以,看起来我的8字节long long int是一个长度为6个字节的long int,我不明白我在这里丢失了什么。 如果有任何帮助,下面是我的gcc编译器的信息:

 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) 

如果有人知道如何(或如果)64位整数我可以访问,我真的很感激任何帮助。 谢谢….

对特定大小的整型数据types使用stdint.h ,并对整数型常量使用适当的后缀,例如:

 #include <stdint.h> int64_t i2 = 0x0000444400004444LL; 

在数字上尝试一个LL后缀,编译器可能将其转换为中间types作为parsing的一部分。 请参阅http://gcc.gnu.org/onlinedocs/gcc/Long-Long.html

long long int i2 = 0x0000444400004444LL;

此外,编译器丢弃前导零,所以0x000044440000变成0x44440000 ,这是一个完全可以接受的32位整数(这就是为什么你没有看到之前的任何警告f2 )。

使用int64_t ,即可移植的C99代码。

 int64_t var = 0x0000444400004444LL; 

打印:

 #define __STDC_FORMAT_MACROS #include <inttypes.h> printf("blabla %" PRIi64 " blabla\n", var); 

如何在c中指定64位整数

违背通常的好主意来追加LL

LL附加到一个整数常量将确保该types至less与long long一样宽。 如果整数常量是八进制或hex,则常量将变为unsigned long long如果需要的话。

如果不介意指定太宽的types,那么LL就可以。 别的,请继续阅读。

long long可能比64位宽。

今天, long long不是64位,但是C指定long long ,至less是 64位。 所以通过使用LL ,在将来,代码可以是指定的,比如128位的数字。

C有整数常量的macros ,在下面的例子中将是typesint_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); } 

产量

 9223372036854775807 0x867530900000000 

对于64位(long long int),后缀ll后缀为hex数字,后缀为unsigned 64位(unsigned long long)