@ Мистика поняла.Короткое замыкание обычно 16-битное и иллюстрирует ответ:
int main()
{
unsigned int x = 65529;
int y = (int) x;
printf("%d\n", y);
unsigned short z = 65529;
short zz = (short)z;
printf("%d\n", zz);
}
65529
-7
Press any key to continue . . .
Немного подробнее.Это все о том, как подписанные числа хранятся в памяти.Выполните поиск для записи с двумя дополнениями для получения более подробной информации, но вот основы.
Итак, давайте посмотрим на 65529 десятичных знаков.Он может быть представлен как FFF9h
в шестнадцатеричном формате.Мы также можем представить это в двоичном виде как:
11111111 11111001
Когда мы объявляем short zz = 65529;
, компилятор интерпретирует 65529 как значение со знаком.В нотации с дополнением до двух верхний бит указывает, является ли значение со знаком положительным или отрицательным.В этом случае вы можете увидеть, что верхний бит - 1
, поэтому он рассматривается как отрицательное число.Вот почему он печатает -7
.
Для unsigned short
нас не волнует знак, поскольку он unsigned
.Поэтому, когда мы распечатываем его с использованием %d
, мы используем все 16 битов, поэтому оно интерпретируется как 65529
.