Этот код выдает (неправильный) результат 255
#include <stdio.h>
int main()
{
unsigned char x = 0;
x = (x-1)%16;
printf("%d", x);
return 0;
}
Хотя этот код выдает результат 15
, который я считаю правильным
#include <stdio.h>
int main()
{
unsigned char x = 0;
x--;
x %= 16;
printf("%d", x);
return 0;
}
Я пытался использовать недостаточный поток в своих интересах, когда произошел этот неожиданный результат.
Проблема не возникает с unsigned int
или любым другим целочисленным типом без знака.
Спасибо, это полезно. Каков механизм решения проблемы?
@TungstenUmbrella Избегайте промежуточных негативов: x = (x-1)%16;
--> x = (x+16-1)%16;
.
@TungstenUmbrella «Проблема не возникает с целым числом без знака или любым другим целочисленным типом без знака». Что у вас происходит с unsigned short x = 0;
?
Смотрите этот пост.
x-1 неявно повышается до signed int, фактически становясь -1
. -1 % 16
(поэтому «остаток -1/16») по-прежнему равен -1, затем он преобразуется обратно в беззнаковый символ, что составляет 255.
Деталь: (x-1)%16
не лучше всего описывается как «мод 16», а скорее как «остаток 16». Обычно "-1 mod 16" считается 15 (евклидов мод).
Вы можете превратить первое во второе с помощью
x = ((unsigned char)(x-1))%16
.