C++ MSVC&x2B+;处理无符号长整型

C++ MSVC&x2B+;处理无符号长整型,c++,visual-c++,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

我对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);
}
但是,当我在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,C99包含printf的“%llu”标志


Simon.

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

HM.似乎在PrtfF中MSVC的栈处理确实是问题。在这种情况下,它只会从堆栈中弹出一个long,留下剩余long的另一半。强制转换为int似乎可以解决问题。这不是问题,而是正确的行为
printf
是一个varargs函数,作为程序员,您负责类型安全。
%X
格式说明符承诺一个
int
,通过传递一个
无符号long-long
,所有下注都被取消。
Address=11042563100175
0A:00:0B:00:0C:00
0A:0B:0C:0D:0E:0F