首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言進階:深度剖析 signed/unsigned char 及溢出機制(中)

     編輯:關於C語言

C語言學習筆記:深入剖析 (un)signed char 及溢出

一、signed char 與 unsigned char 的取值範圍

char 類型同 int 一樣,分有號與無號:signed char 與 unsigned char。C 標準未規定預設 char 是否有號,由編譯器決定(本文環境預設為有號)。兩者均佔 1 位元組(8 位),但取值範圍不同:

  • unsigned char:0 ~ 255
  • signed char:-128 ~ 127

二、溢出問題示例

1. unsigned char 溢出

上界溢出:254、255 正常;256、257 超出範圍。
下界溢出:0、1、2 正常;-1、-2 越界。

2. signed char 溢出

上界溢出:126、127 正常;128、129 越界。
下界溢出:-127、-128 正常;-129、-130 越界。

三、signed char 溢出的二進制表示與解析

透過程式驗證得出關鍵規律:

  • 無論是否越界,每增減 1 單位,直接在二進制最後 8 位加減 1。
  • 若倒數第 8 位(符號位)變為 1,前 24 位全置 1,解釋為負數;若變為 0,前 24 位全置 0,解釋為正數。

具體案例分析

  1. 128 = 127 + 1。127 二進制 0..0 0111 1111,加 1 變 1..1 1000 0000,符號位為 1,前 24 位全 1,值為 -128(補碼表示)。
  2. 129 = 127 + 2,二進制 1..1 1000 0001,值為 -127。
  3. -129 = -128 - 1。-128 為 1..1 1000 0000,減 1 變 0..0 0111 1111,符號位 0,前 24 位全 0,值為 127。
  4. -130 同理得 126。

174922885.png 174940112.png

四、unsigned char 溢出表示

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

174958991.png 175014280.png

五、疑惑與延伸

核心定律:無符號型前 24 位恆為 0;有符號型前 24 位恆等於倒數第 8 位。
下一篇將探討:變數定義為 unsigned 卻用 %d(有號)輸出,或反之,會發生什麼?敬請期待《C語言進階【暑期特別篇】深入解剖 (un)signed 及溢出(下)》。


本文出自「趙玉強的博客」,轉載請保留出處:https://zhaoyuqiang.blog.51cto.com/6328846/1259300

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved