我在使用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.
printf
是一个可变参数函数,作为程序员,您需要负责类型安全。%X
格式说明符承诺一个int
类型,但如果传递了一个unsigned long long
类型,那么一切都无法保证。 - Ben Voigt