我正在尝试在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'类型来说太大
当我用'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)
如果有人知道我可以访问64位整数(或者如果),我真的很感激任何帮助。感谢....
答案 0 :(得分:68)
对整数数据类型的特定大小使用stdint.h
,并对整数文字常量使用适当的后缀,例如:
#include <stdint.h>
int64_t i2 = 0x0000444400004444LL;
答案 1 :(得分:28)
在数字上尝试LL
后缀,编译器可能会将其作为解析的一部分转换为中间类型。见http://gcc.gnu.org/onlinedocs/gcc/Long-Long.html
long long int i2 = 0x0000444400004444LL;
此外,编译器正在丢弃前导零,因此0x000044440000
正在变为0x44440000
,这是一个完全可接受的32位整数(这就是为什么你之前没有看到任何警告的原因) f2
)。
答案 2 :(得分:5)
使用int64_t
,便携式C99代码。
int64_t var = 0x0000444400004444LL;
用于打印:
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
printf("blabla %" PRIi64 " blabla\n", var);
答案 3 :(得分:3)
如何在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);
}
输出
9223372036854775807
0x867530900000000
答案 4 :(得分:1)
将ll后缀附加到64位(long long int)的十六进制数字, 或ull后缀为无符号64位(无符号长long)