Я ожидал, что вывод будет x == y, так как во время сравнения знаковый символ должен быть преобразован в беззнаковый int?
Ну, ты на полпути.
Когда значение -1
преобразуется (фактически повышается) в unsigned int
, представление производит максимально возможное значение, представляемое типом. Следовательно, продвигаемое значение становится больше, чем x
, что равно 1
.
Цитирование C11
, глава §6.3.1.8, Обычные арифметические преобразования
В противном случае, если операнд, имеющий целочисленный тип без знака, имеет ранг больше или равен рангу типа другого операнда, то операнд с целочисленным типом со знаком преобразуется в тип операнда с целочисленным типом без знака.
Уточняю, продвижение не значит, снимает подписку. Операнд (значение) со знаком рассматривается как продвинутый тип. Значение определяется из битового представления. Подробности: глава §6.3.1.3,
В противном случае, если новый тип не имеет знака, значение преобразуется путем многократного добавления или вычитания на единицу больше, чем максимальное значение, которое может быть представлено в новом типе, пока значение не окажется в диапазоне нового типа.
Чтобы добавить к вышесказанному, использование
printf("%d",(signed char)x);
и
printf("%d",(unsigned int)y);
не годятся. %d
ожидает целочисленный тип со знаком (int
) в качестве аргумента.
- Если вы хотите напечатать значение
signed char
, используйте %hhd
- Если вы хотите напечатать
unsigned int
, используйте %u
person
Sourav Ghosh
schedule
28.11.2017