2011-03-24 201 views
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。

+0

嗯。看来MSVC在printf中的堆栈处理的确是问题。在这种情况下,它只会从堆栈中弹出一个单独的长,剩下的剩余一半。强制转换为int似乎可以解决问题。 – Simon 2011-03-24 03:57:34

+0

这不是问题,它是正确的行为。 'printf'是一个可变参数函数,你作为程序员负责类型安全。 '%X'格式说明符承诺'int',通过传递'unsigned long long'来代替,所有投注都关闭。 – 2011-03-24 04:06:09

回答

5

%X格式说明符需要32位参数。你传递64位数据,扔掉堆栈。你可以使用%llX。对于C和C++代码,CRT是相同的。