如何在c中指定64位整数

use*_*262 51 c 64-bit sizeof

我正在尝试在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));
Run Code Online (Sandbox Code Playgroud)

我得到的回应是:

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;
Run Code Online (Sandbox Code Playgroud)

最后4个变量(f2,g2,h2,i2)给出了错误信息:

警告:整数常量对于'long'类型来说太大了

当我用'int64_t'替换'long long int'时,我得到了相同的结果.我假设'int64_t'被识别,因为它没有生成任何自己的错误消息.

所以,看起来我的8字节长long 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)   
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*l R 71

使用stdint.h整数数据类型的特定尺寸,还可以使用相应的后缀整数立即数,例如:

#include <stdint.h>

int64_t i2 = 0x0000444400004444LL;
Run Code Online (Sandbox Code Playgroud)

  • 使用C99`long long int`至少是64位,所以它取决于你想要的可移植性 - 如果你可以假设C99那么你就可以了.但对我来说,如果你需要一个明确的大小然后应该明确表达它似乎是"毫不费力" - 它不会花费你任何东西,它更具可读性和不言自明,并且它往往更便携. (5认同)
  • `int64_t`既健壮又便携.`long long int`不是. (3认同)
  • 理论上,“int64_t”是可选的。但是,“int_least64_t”和“long long int”是标准强制规定的(从 C99 开始),并且必须至少有 64 位(63 个值位 + 符号位)。 (2认同)
  • @doug65536 使用 `INT64_C(0x0000444400004444)` 作为至少 64 位的常量。将添加“适当的”后缀。 (2认同)

Mar*_*ett 28

尝试LL对数字进行后缀,编译器可能会将其作为解析的一部分转换为中间类型.请参阅http://gcc.gnu.org/onlinedocs/gcc/Long-Long.html

long long int i2 = 0x0000444400004444LL;

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


chu*_*ica 6

如何在c中指定64位整数

与附加的通常好主意相反LL

附加LL整数常量将确保类型至少与 一样宽long long。如果整数常量是八进制或十六进制,则常量将unsigned long long在需要时变为。

如果不介意指定太宽的类型,那么就LL可以了。 否则,请继续阅读。

long long可能比 64 位更宽。

long long如今,非 64 位的情况很少见,但 C 指定至少long long为64 位。所以通过使用LL, 将来,代码可能会指定一个 128 位数字。

C 有用于整数常量的宏,在下面的情况下将是类型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);
}
Run Code Online (Sandbox Code Playgroud)

输出

9223372036854775807
0x867530900000000
Run Code Online (Sandbox Code Playgroud)


Kar*_*ath 5

使用int64_t,便携式C99代码.

int64_t var = 0x0000444400004444LL;
Run Code Online (Sandbox Code Playgroud)

用于打印:

#define __STDC_FORMAT_MACROS
#include <inttypes.h>

printf("blabla %" PRIi64 " blabla\n", var);
Run Code Online (Sandbox Code Playgroud)

  • long long int是*至少*64位.int64_t是*正好*64位. (4认同)