Почему (без знака) 0x8000 0001 равно 1, а не 65535? - PullRequest
0 голосов
/ 05 июля 2019

C 11 6.3.1.3, для литых:

В противном случае, если новый тип является беззнаковым, значение преобразуется путем многократного сложения или вычитания значения, превышающего максимальное значение, которое может быть представлено в новом типе, до тех пор, пока значение не окажется в диапазоне нового типа.

Когда я пытаюсь

printf("%d", (unsigned short) 0x80000001);

Я ожидаю, что результат будет 65535, но я получил 1. Почему 1 возвращается в этом случае?

Ответы [ 2 ]

4 голосов
/ 05 июля 2019
  • 0x80000001 = 2147483649
  • Максимальное значение unsigned short равно 65535.Еще одно значение - 65536.
  • «значение преобразуется многократно ... вычитая на единицу больше, чем максимальное значение».
  • Повторное вычитание до тех пор, пока значение в диапазоне (меньше 65536) не станет таким же, как модуль.
  • 2147483649 % 65536 = 1.

Но это формальная теория - на практике это то же самое, что просто взять младшие 16 бит 0x80000001,это значение 0x0001.

2 голосов
/ 05 июля 2019

USHRT_MAX, в случае OP - 65535. (unsigned short) 0x80000001 преобразуется в 1 для C 11 6.3.1.3, как указано.

unsigned short 1 определенно преобразуется в int 1 для целочисленного продвижения как часть, являющаяся аргументом функции .... Это соответствует "%d" и печатается "1".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...