我正在尝试将16个十六进制值放入视觉C中的无符号长整数
unsigned long long test = 0x1A2A00DABABA7890;
printf("long long value %X\n", test);
printf("%d", sizeof(test));
我的输出显示它是8个字节,但只存储前4个字节 它输出
long long value BABA7890
8
我是否误解了这是如何运作的?谢谢你的帮助。
答案 0 :(得分:4)
您的printf
格式说明符与您的类型不匹配,这会导致未定义的行为。尝试:
printf("long long value %llX\n", test);
%d
也是sizeof
结果的错误格式。您应该在那里使用%zu
。
如果您打开一些警告设置,您的编译器可能会发出警告(例如,clang
默认情况下):
example.c:6:30: warning: format specifies type 'unsigned int' but the argument
has type 'unsigned long long' [-Wformat]
printf("long long value %X\n", test);
~^ ~~~~
%llX
example.c:7:14: warning: format specifies type 'int' but the argument has type
'unsigned long' [-Wformat]
printf("%d", sizeof(test));
~^ ~~~~~~~~~~~~
%ld
2 warnings generated.
编辑:我在你的问题中注意到你正在使用Visual C. %z
是一个C99功能,你的编译器可能不支持。在这种情况下,您应该检查文档以查看正确的格式。
答案 1 :(得分:0)
unsigned long long
的正确格式说明符是llX
(这是椭圆形,而不是十一个)。
来自标准:
ll(ell-ell):指定以下
d
,i
,o
,u
,x
或X
转换说明符适用于long long int
或unsigned long long int
参数;或者以下n
转换说明符适用于指向long long int
参数的指针。
答案 2 :(得分:0)
正确存储它但你没有正确打印
对于unsigned long long,您需要使用%llX
答案 3 :(得分:-1)
您需要指定整数的宽度。默认情况下,printf将假定它是32位。使用I64前缀,如下所示:
printf(“long long value%I64X”,test);
这里记录了Visual C / C ++:
http://msdn.microsoft.com/en-us/library/vstudio/56e442dc(v=vs.100).aspx