MSVC++ 处理无符号长长整型数据类型

3

我在使用MSVC处理无符号长整型整数时遇到了问题。以下是可复现问题的代码:

// test.cpp (note extension)
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    unsigned long long int address = 0x0A0B0C0D0E0F;
    printf("Address=%llu\n", address);

    printf("%02X:%02X:%02X:%02X:%02X:%02X\n",
            ((address >> (5 * 8)) & 0xff),
            ((address >> (4 * 8)) & 0xff),
            ((address >> (3 * 8)) & 0xff),
            ((address >> (2 * 8)) & 0xff),
            ((address >> (1 * 8)) & 0xff),
            (address & 0xff));

    printf("%02X:", ((address >> (5 * 8)) & 0xff));
    printf("%02X:", ((address >> (4 * 8)) & 0xff));
    printf("%02X:", ((address >> (3 * 8)) & 0xff));
    printf("%02X:", ((address >> (2 * 8)) & 0xff));
    printf("%02X:", ((address >> (1 * 8)) & 0xff));
    printf("%02X\n", (address & 0xff));

    exit(0);
}

当我在Linux上编译时,我得到了预期的结果:
Address=11042563100175
0A:0B:0C:0D:0E:0F
0A:0B:0C:0D:0E:0F

然而,当我在 MSVC++ 2008 Express 上编译时,会出现以下错误:
Address=11042563100175
0A:00:0B:00:0C:00
0A:0B:0C:0D:0E:0F

我格式化了我的printf语句吗?或者在移位/与运算后,MSVC是否在堆栈上留下多余的字节?还是问题出在其他地方?
注:使用MSVC编译时,需要使用“.cpp”文件扩展名来强制使用C++模式。我相信这是因为在纯C模式下,MSVC不包含(全部)C99,其中包括printf的“%llu”标志。
Simon.

嗯。看起来 MSVC 在 printf 中的堆栈处理确实存在问题。在这种情况下,它只从堆栈中弹出一个 long,留下另一半 long。将其转换为 int 似乎可以解决这个问题。 - Simon
这不是问题,而是正确的行为。printf是一个可变参数函数,作为程序员,您需要负责类型安全。%X格式说明符承诺一个int类型,但如果传递了一个unsigned long long类型,那么一切都无法保证。 - Ben Voigt
1个回答

5

%X格式说明符需要一个32位参数。您正在传递64位,导致堆栈出现偏移。您可以使用%llX。CRT对C和C++代码是相同的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接