C ++ / MSVC 2005 / Windows 7 64位中奇怪的char行为

时间:2010-11-28 14:13:59

标签: windows-7 visual-studio-2005

我正在使用带有MSVC2005和QT的Windows 7 64位(但我怀疑QT是否会导致问题,因为这是基本数据类型char的问题。

所以当我尝试比较两个char时就像这样

char A=0xAA;

if(A==0xAA)
 printf("Success");
else
 printf("Fail");

瞧,它失败了!但是当我这样做时

char A=0xAA;
char B=0xAA;

if(A==B)
 printf("Success");
else
 printf("Fail");

我成功了!实际上当我想到它...嘿我正在使用64位处理器..即使char应该被视为1个字节。它可能存储为4个字节。 所以

char A=0xAA;

if(A==0xFFFFFFAA)
 printf("Success");
else
 printf("Fail");

现在我成功了!

但是WTF!这是标准行为!!如果该死的东西被定义为char,那么编译器不应该知道如何处理它吗?进一步的测试显示,如果char的最高有效位为1,则额外字节仅存储为1。因此0x07和更低的存储为0x00000007。 WTF。

实际上我似乎已回答了我的所有问题......除了要求修复此错误的人。这甚至是一个错误吗?您可以在64位操作系统上使用MSVC2005,或者我是一个白痴。我想我应该让qt创建者使用MSVC2010 ..该死的。我花了2个小时。

2 个答案:

答案 0 :(得分:6)

您正在将(签名)char与值-86(256-0xAA)比较为值为170(0xAA)的整数。

对于32位系统和8位系统也是如此。

答案 1 :(得分:2)

与64位无关:您需要将A定义为unsigned char以获得正确的行为。编译器警告显示此代码可能不正确:

警告C4309:'初始化':截断常数值