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

深入解析:為何 signed char 範圍是 -128 到 +127

     編輯:關於C語言

前言

許多初學者疑惑:`signed char` 為 8 位元,為何範圍不是 -127~127,而是 -128~127?關鍵在於電腦採用 二補數 表示有號整數。本文從原碼、反碼、補碼定義推導,並附贈兩道經典面試題。

一、三種編碼定義

  • 原碼:最高位為符號位(0 正、1 負),其餘為數值絕對值。
  • 反碼:正數同原碼;負數符號位不變,數值位按位取反。
  • 補碼:正數同原碼;負數在反碼基礎上 +1。(電腦實際儲存與運算形式)

二、8 位元補碼對應表推導

補碼 (二進位)對應原碼十進位值實際表示
0000 00000000 000000
............
0111 11110111 1111127+127
1000 00001000 0000128-128
............
1111 11110000 00011-1

關鍵點:1000 0000 在補碼系統中無對應的正數原碼(正數最大 0111 1111 = 127),電腦直接將其視為 -128。這是因為補碼編碼下,負數範圍比正數多一個,且 最高位權值為 -128(而非 -0)。

驗證:1000 0000 = -128 + 0 = -128;1111 1111 = -128 + 64+32+16+8+4+2+1 = -1。

三、經典練習題

題目 1:陣列初始化與 strlen

int main() {
    char a[1000];
    for (int i = 0; i < 1000; i++) a[i] = -1 - i;
    printf("%d\n", strlen(a));
    return 0;
}

解析:`char` 預設有號(實作定義),`-1 - i` 依補碼截取低 8 位。`strlen` 尋找第一個 `\0` (0x00)。
`i=0` → -1 (0xFF) … `i=254` → -255 (0x01) → `i=255` → -256 (0x00)。
第 256 個元素 (索引 255) 為 0,`strlen` 回傳 255。

答案:255

題目 2:有號/無號混合比較

void foo() {
    unsigned int a = 6;
    int b = -20;
    (a + b) > 6 ? puts(">6") : puts("<=6");
    printf("%u\n", a + b);
}

解析:`a+b` 含無號數,`b` 隱式轉為 `unsigned int` (4294967276)。
`6 + 4294967276 = 4294967282` (模 2^32),大於 6 → 輸出 `>6`。
`printf("%u")` 印出 4294967282。

答案:>6

四、總結

理解補碼編碼機制,即可釐清有號整數範圍非對稱的本質:最高位權值為負,導致負數多一個表示值。實務上需警惕有號/無號混合運算導致的隱式轉換陷阱。

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