MSVC++处理unsigned long long int

Sim*_*mon 3 c++ visual-c++

我遇到了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);
}
Run Code Online (Sandbox Code Playgroud)

当我在linux上编译它时,我得到(正如预期的那样):

Address=11042563100175
0A:0B:0C:0D:0E:0F
0A:0B:0C:0D:0E:0F
Run Code Online (Sandbox Code Playgroud)

但是,当我在MSVC++ 2008 Express上编译它时,我得到:

Address=11042563100175
0A:00:0B:00:0C:00
0A:0B:0C:0D:0E:0F
Run Code Online (Sandbox Code Playgroud)

我是否错误地格式化了我的printf语句?或者,在移位/操作之后,MSVC是否在堆栈上留下了额外的字节?或者是其他问题?

注意:使用MSVC进行编译时,需要使用'.cpp'文件扩展名来强制使用C++模式.我相信这是因为直接C模式下的MSVC不包括(全部)C99,其中包含printf的'%llu'标志.

西蒙.

Han*_*ant 5

%X格式说明符需要32位参数.你正在传递64位,抛弃堆栈.您可以使用%llX.CRT与C和C++代码相同.