【发布时间】:2012-03-25 06:35:28
【问题描述】:
我正在尝试在 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 位。
但是,当我尝试声明以下变量时:
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 个变量 (f2,g2,h2,i2) 给我错误信息:
警告:整数常量对于“long”类型来说太大了
当我将 'long long int' 替换为 'int64_t' 时,我得到了相同的结果。我假设 'int64_t' 已被识别,因为它自己没有生成任何错误消息。
所以,看来我的 8 字节长 int 实际上是 6 字节长长 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 位整数,我将非常感谢任何帮助。谢谢....
【问题讨论】:
-
作为
LL后缀的替代,使用-std=c99编译也应该可以工作。在 C99 中,十六进制整数常量的类型为long long int或unsigned long long int,如果它太大而无法放入(unsigned) long int,但适合(unsigned) long long int。不需要后缀。 -
这里应该提到的一点是,问题不在于 long long int 变量
f2到i2,而是您指定的整数文字。在 C89 中,如果给定的值适合该类型,则没有指定后缀的整数文字的类型为int,否则它的类型为long int。问题是,0x0000444400004既不适合int也不适合long int类型,这就是编译器所抱怨的。这里的分配不是问题,您将long int分配给long long int。正如 Daniel 所写,c99 通过允许long long文字来解决这个问题。 -
@DanielKamilKozar 我补充说。