char
является 8-битным, поэтому, когда вы пишете char x = 132
, вы фактически делаете это:
x = 1000 0100
signed int
и unsigned int
оба 32-битные, и всякий раз, когда вы назначаетезначение переменной «меньшего размера» в значение «большего размера» используется системой расширение знака , т.е. копирует бит знака в каждый бит слева.Таким образом, значение становится следующим:
1111 1111 1111 1111 1111 1111 1000 0100
Если вы интерпретируете его как значение со знаком, оно равно -124, а как значение без знака - 4294967172.
Более того, если вы определите char
как unsigned
в первой строке, вы всегда получите 132, так как расширение знака не выполняется для значений без знака.