将64位枚举传递给Printf时出现VS2010错误

时间:2016-10-23 13:13:23

标签: c++ visual-studio-2010 enums compiler-bug

VC ++ 2010中遇到了一些奇怪的结果:

enum dow :unsigned long long {mon=0x800022223333ULL,tue};
int _tmain(int argc, _TCHAR* argv[])
{
    dow a=mon;
    unsigned long long b=0x800022223333ULL;
    printf("%d\n",sizeof(a));
    printf("%llx\n",a); // a is 32bit or 64 bit???
    printf("%llx\n",(unsigned long long)a);
    printf("%llx\n",b);
    return 0;
}

我得到了一些意想不到的结果:

8
1ff1d3f622223333
800022223333
800022223333

1ff1d3f622223333不正确。在检查生成的汇编代码之后,我发现编译器在printf中为a传递了一个32位0x22223333,然后被printf格式规范错误地解释为64位。因此插入了垃圾1ff1d3f6。为什么会这样?

EDIT 忘了说它是使用Release和Debug Configuration编译为32位exe文件。

1 个答案:

答案 0 :(得分:1)

这似乎是该版Visual Studio中的一个错误。以下代码:

#include <cstdio>

enum dow :unsigned long long {mon=0x800022223333ULL,tue};
int main()
{
    dow a=mon;
    unsigned long long b=0x800022223333ULL;
    printf("%d\n",sizeof(a));
    printf("%llx\n",a); // a is 32bit or 64 bit???
    printf("%llx\n",(unsigned long long)a);
    printf("%llx\n",b);
    return 0;
}

在VS2010中产生类似的结果:

8
22223333
800022223333
800022223333

但是,看起来它已在以后的版本中得到修复,VS2015 Express中运行的代码相同:

8
800022223333
800022223333
800022223333

由于我们的VS2010版本已安装所有补丁,因此在该版本中看起来从未修复过。因此,我的建议(如果你真的需要那些大的枚举)是升级。