我试图在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));
我得到的回答是:
长整型的大小:4长整型的大小: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”类型太大
当我用'int64_t'替换'long long int'时,得到了相同的结果。我假设'int64_t'是可识别的,因为它本身没有生成任何错误消息。
看起来我的8字节长的整型实际上是6字节长的整型,我不明白我错过了什么,如果有帮助的话,这里是我的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位整数是我访问,我真的很感激任何帮助。谢谢...
6条答案
按热度按时间cu6pst1q1#
stdint.h
用于整型数据类型的特定大小,还可以为整型常量使用适当的后缀,例如:gpnt7bae2#
尝试在数字上加上
LL
后缀,编译器可能会将其强制转换为中间类型作为分析的一部分。long long int i2 = 0x0000444400004444LL;
另外,编译器丢弃前导零,因此
0x000044440000
变为0x44440000
,这是一个完全可以接受的32位整数(这就是为什么在f2
之前没有看到任何警告)。6psbrbz93#
使用
int64_t
,即可移植的C99代码。用于打印:
z31licg04#
如何在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
类型输出
6ju8rftf5#
对于64位(long long int),将ll后缀附加到十六进制数字;对于无符号64位(unsigned long long),将ull后缀附加到十六进制数字
y0u0uwnf6#
可疑的编译器错误
从C99开始,所有4个常量都应该按原样编译,没有警告。不需要
LL
后缀。在C89中,编译器应该报告
long long
,除非long long
可以作为编译器扩展。在这种情况下,是否需要后缀取决于编译器扩展。