По умолчанию целые числа , такие как -250
, имеют тип int
. Кроме того, отрицательные значения сохраняются в памяти в форме дополнения до двух . Давайте вычислим форму дополнения до двух -250 (см. Создание формы дополнения до двух параграфа в вики):
- Положительный
250
- это 11111010
(первые 8 бит, ведущие нули опущены)
- Дополнить его и получить
00000101
(первые 8 бит, ведущие единицы опущены)
- Добавьте единицу и получите
00000110
(первые 8 бит, ведущие единицы опущены)
Правила преобразования типов для целочисленных типов в C говорят, что мы должны отбросить левые биты, чтобы получить 8-битный символ. Для более подробной информации смотрите K & R A.6.2 (ну, это для русского издания, может быть, в оригинальной книге есть другое место).
Таким образом, unsigned char p
получает в точности значение 00000110
(6
в десятичном виде). Вот почему вы получаете 6 на выходе.
Думаю, теперь вы понимаете, почему в секунду -250
printf
;)