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文件。
答案 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版本已安装所有补丁,因此在该版本中看起来从未修复过。因此,我的建议(如果你真的需要那些大的枚举)是升级。