1

我正在尝试将 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

我是否误解了这是如何工作的?谢谢你的帮助。

4

4 回答 4

5

您的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 功能,您的编译器可能不支持。在这种情况下,您应该检查文档以查看要使用的正确格式。

于 2013-02-01T02:40:02.693 回答
1

an 的正确格式说明符unsigned long longllX(即 ell-ell,而不是十一)。

从标准:

ll (ell-ell):指定后面的d, i, o, u, x, orX转换说明符适用于long long intorunsigned long long int参数;或者后面的n转换说明符适用于指向long long int参数的指针。

于 2013-02-01T02:39:58.527 回答
1

它正在正确存储它,但您没有正确打印它

对于 unsigned long long,您需要使用 %llX

于 2013-02-01T02:42:08.373 回答
-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

于 2013-02-01T02:44:32.800 回答