无法将所有8个字节都放入unsigned long long中

时间:2013-02-01 02:37:30

标签: c hex

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

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

4 个答案:

答案 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):指定以下diouxX转换说明符适用于long long intunsigned 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