3
我遇到了MSVC处理无符号长整数的问题。下面是代码重现:MSVC++处理无符号long long int
// 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中的堆栈处理的确是问题。在这种情况下,它只会从堆栈中弹出一个单独的长,剩下的剩余一半。强制转换为int似乎可以解决问题。 – Simon 2011-03-24 03:57:34
这不是问题,它是正确的行为。 'printf'是一个可变参数函数,你作为程序员负责类型安全。 '%X'格式说明符承诺'int',通过传递'unsigned long long'来代替,所有投注都关闭。 – 2011-03-24 04:06:09