我正在尝试将 16 个十六进制值放入可视 C 中的 unsigned long long
unsigned long long test = 0x1A2A00DABABA7890;
printf("long long value %X\n", test);
printf("%d", sizeof(test));
我的输出显示它是 8 个字节,但在输出时只存储前 4 个字节
long long value BABA7890
8
我是否误解了这是如何工作的?谢谢你的帮助。
您的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 功能,您的编译器可能不支持。在这种情况下,您应该检查文档以查看要使用的正确格式。
an 的正确格式说明符unsigned long long
是llX
(即 ell-ell,而不是十一)。
从标准:
ll (ell-ell):指定后面的
d
,i
,o
,u
,x
, orX
转换说明符适用于long long int
orunsigned long long int
参数;或者后面的n
转换说明符适用于指向long long int
参数的指针。
它正在正确存储它,但您没有正确打印它
对于 unsigned long long,您需要使用 %llX
您需要指定整数的宽度。默认情况下,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