C++中的有符號的字元變數可以儲存-128~127之間的整數,為什麼是-128而不是-127?

C++中的有符號的字元變數可以儲存-128~127之間的整數,為什麼是-128而不是-127?天涯工控2020-02-10 17:44:22

在計算機中,可以區分正負的型別,稱為有符型別(signed),無正負的型別(只有正值),稱為無符型別。 (unsigned)數值型別分為整型或實型,其中整型又分為無符型別或有符型別,而實型則只有符型別。 字元型別也分為有符和無符型別。

而在二進位制的資料中,最高位是表示資料的正負之分。例如,1個位元組的型別,如字元型別,最高位是第7位,2個位元組的數,最高位是第15位,4個位元組的數,最高位是第31位。不同長度的數值型別,其最高位也就不同,但總是最左邊的那位(即最高位)。而字元型別固定是1個位元組,所以最高位總是第7位。

但在計算機裡面所有數都是用補碼錶示的,正數補碼是其本身,

負數補碼是原碼的反碼加1。

最小正數二進位制是0000 0000=0

最大正數二進位制是0111 1111 = 64+32+16+8+4+2+1=127

最大負數二進位制是1111 1111 = -1

最小負數二進位制是1000 0000→

反碼:1111 1111→ 補碼: - {(1+2+4+8+16+32+64)+1} =-(127+1)=-128

所以, 8位有符號的整數取值範圍的補碼錶示 1000 0000 到 0000 0000, 再到 0111 1111 即 -128 到 0, 再到 127 最終 -128 ~ +127。

原碼、反碼、補碼定義:

原碼 最高位為符號位,其餘為對應數值的絕對值的二進位制數值表示;

反碼 最高位為符號位,正數=原碼 負數=符號位+原碼對應的其他位數取反;

補碼 最高位為符號位,正數=原碼 負數=反碼+1。

其中,符號位“0為+,1為-”。