Поведение Weired в C ++ / MSVC2005 / Windows 7 64 бит - PullRequest
0 голосов
/ 28 ноября 2010

Я использую Windows 7 64 бит с MSVC2005 и QT (но я сомневаюсь, что QT вызывает проблему, поскольку это проблема с основным типом данных 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-битный процессор ... хотя предполагается, что символы должны обрабатываться как 1 байт. Вероятно, они хранятся как 4 байта. Так что

char A=0xAA;

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

Теперь я получаю успех !!!

Но WTF!Является ли это стандартным поведением !! Если проклятая вещь определена как символ, разве компилятор не должен знать, что с ним делать? Дальнейшие тесты показывают, что дополнительные байты сохраняются как единичные, если наиболее значимый бит символа является1. Таким образом, 0x07 и ниже сохраняются как 0x00000007. WTF.

На самом деле я, кажется, ответил на все мои вопросы ... кроме того, кому звонить, чтобы исправить эту ошибку. Это даже ошибка? Вы можете использоватьMSVC2005 на 64-битных операционных системах правильноили я идиот.Я думаю, я должен заставить Qt Creator использовать MSVC2010 ... черт побери.Там идут мои 2 часа.

Ответы [ 2 ]

6 голосов
/ 28 ноября 2010

Вы сравниваете (подписанный) символ со значением -86 (256-0xAA) с целым числом со значением 170 (0xAA).

То же самое произойдет в 32-разрядной и 8-разрядной системах.

2 голосов
/ 28 ноября 2010

Не относится к 64-битным: вам нужно определить A как unsigned char, чтобы получить правильное поведение.Предупреждение компилятора показывает, что этот код может быть неправильным:

предупреждение C4309: «инициализация»: усечение постоянного значения

...