資料表示法與數字系統

符號擴展(sign extension)

符號擴展是把一個有號數加寬到更多位元——例如把 8 位元的值搬進 16 位元的格子——卻不改變它意義的方法。最直覺的想法、用零去填新的高位,只對正數有效。對二補數裡的負數來說那會是錯的。修正既簡單又優雅:把原本的符號位元(最高位)複製到左邊每一個新位元。想像把一面旗幟拉長:你不會把新布料留白,而是延續邊緣原本的顏色。

這就是它行得通的原因。在二補數裡,-5 在 8 位元是 1111 1011。要做成 16 位元,你把符號位元(一個 1)複製到全部八個新的高位,得到 1111 1111 1111 1011。用位值去讀它仍是 -5,因為新的 -2^15 權重,正好被新增的 2^14 + 2^13 + … + 2^8 那些 1 抵消掉。正數同理,用 0 當符號位元:8 位元的 +5(0000 0101)擴展成 0000 0000 0000 0101,仍是 +5。所以你永遠複製最高位元——正數用 0、負數用 1——數值就被保住。

這在處理器內部不斷發生。當一條指令把一個小的有號值(例如一個位元組或一個短的立即值)載入較寬的暫存器時,硬體會對它做符號擴展,好讓算術結果正確。兩個誠實的提醒:第一,符號擴展只對有號值正確——無號值必須做零擴展(用 0 填補),用錯了會悄悄把數弄壞;第二,這是「加寬」的方向。「縮窄」(截斷成較少位元)是危險的反向,因為它可能丟掉有意義的位元,把一個大值變成一個錯誤的小值。

把 8 位元的 -5(1111 1011)符號擴展到 16 位元,做法是複製符號位元 1:結果 1111 1111 1111 1011,仍是 -5。把 8 位元的 +5(0000 0101)以複製 0 擴展:結果 0000 0000 0000 0101,仍是 +5。

把最高位複製到新的高位,以安全地加寬一個有號值。

有號值做符號擴展、無號值做零擴展——選錯加寬方式會悄悄毀掉數。它與截斷相反,截斷可能丟失有意義的位元,是會失真的方向。

又称
sign-extend符號延伸