Сравнение переменной C и константы не совпадает - PullRequest
8 голосов
/ 14 сентября 2008

Если у меня есть:

signed char * p;

и я делаю сравнение:

if ( *p == 0xFF )
   break;

он никогда не поймает 0XFF, но если я заменю его на -1, это будет:

if ( *p == (signed char)0xFF )
   break;

Как это может произойти? Это что-то со знаменем? Я думал, что 0xFF == -1 == 255.

Ответы [ 4 ]

29 голосов
/ 14 сентября 2008

Значение 0xFF является значением int со знаком. C будет повышать *p до int при выполнении сравнения, поэтому первый оператор if эквивалентен:

if( -1 == 255 ) break;

что, конечно, неверно. Используя (signed char)0xFF, оператор эквивалентен:

if( -1 == -1 ) break;

, который работает, как вы ожидаете. Ключевым моментом здесь является то, что сравнение выполняется с типами int вместо типов signed char.

4 голосов
/ 14 сентября 2008

Целочисленные литералы имеют тип int со знаком. Так как 0xFF является знаком со значением int, компилятор преобразует * p в число со знаком и затем выполняет сравнение.

Когда * p равно -1, которое затем преобразуется из знакового символа в подписанное целое число, оно все равно равно -1, что имеет представление 0xFFFFFFFF, которое не равно 0xFF.

2 голосов
/ 14 сентября 2008

При первом сравнении он преобразуется в int, поскольку 0xFF по-прежнему считается целым, то есть ваш символ равен от -128 до 127, но 0xFF по-прежнему равен 255.

Во втором случае вы говорите, что 0xFF действительно подписанный символ, а не int

1 голос
/ 14 сентября 2008

0xff будет рассматриваться как целочисленная константа со значением 255. Вы всегда должны обращать внимание на такого рода сравнения между различными типами. Если вы хотите быть уверены в том, что компилятор сгенерирует правильный код, вы должны использовать приведение типа:

if( *p == (signed char)0xFF ) break;

В любом случае, остерегайтесь , что следующее утверждение будет не работать так же:

if( (int)*p == 0xFF ) break;

Кроме того, возможно, было бы лучше избежать подписанных символов или, если вы должны использовать подписанные символы, сравнить их со значениями со знаком, такими как -1, в данном случае:

if( *p == -1 ) break;

0xff == - 1, только если эти значения будут присвоены некоторым переменным типа char (или unsigned char):

char a=0xff;
char b=-1;
if(a==b) break;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...