char 類型同 int 一樣,分有號與無號:signed char 與 unsigned char。C 標準未規定預設 char 是否有號,由編譯器決定(本文環境預設為有號)。兩者均佔 1 位元組(8 位),但取值範圍不同:
上界溢出:254、255 正常;256、257 超出範圍。
下界溢出:0、1、2 正常;-1、-2 越界。
上界溢出:126、127 正常;128、129 越界。
下界溢出:-127、-128 正常;-129、-130 越界。
透過程式驗證得出關鍵規律:
0..0 0111 1111,加 1 變 1..1 1000 0000,符號位為 1,前 24 位全 1,值為 -128(補碼表示)。1..1 1000 0001,值為 -127。1..1 1000 0000,減 1 變 0..0 0111 1111,符號位 0,前 24 位全 0,值為 127。

規則類似,差別在前 24 位永遠為 0,數值永遠為正。
256 = 255 + 1,0..0 1111 1111 加 1 產生進位,取低 8 位得 0。
-1 = 0 - 1,視為 0..01 0000 0000 減 1,低 8 位得 255。
-2 同理得 254。

核心定律:無符號型前 24 位恆為 0;有符號型前 24 位恆等於倒數第 8 位。
下一篇將探討:變數定義為 unsigned 卻用 %d(有號)輸出,或反之,會發生什麼?敬請期待《C語言進階【暑期特別篇】深入解剖 (un)signed 及溢出(下)》。
本文出自「趙玉強的博客」,轉載請保留出處:https://zhaoyuqiang.blog.51cto.com/6328846/1259300