八位的帶符號的整數,好比JAVA中的byte,c#中的SByte,爲何值域範圍都是-128-127而不是-127~128?c#
事實上,遠古時期有些計算機的設計是採用了反碼錶示有符號數的,所以8位有符號數的範圍是-127~127,它的一個缺點是0是有正負。它用一位表示正負數,然對剩餘的位數採用取反。ide
好比,0111 1111表示127,那-127的則是1000 0000。0000 0000表示正的0,而1111 1111則表示成爲負0。所以反碼做爲有符號的整數並未流行。設計
如今的計算機中,一般將正數的補碼來表示其負數,採用補碼的好處是在硬件電路的實現上,只要使用一種加法電路就能夠處理各類有符號數的加減計算,使得電路設計簡單。it
而補碼計算方式爲取反碼加1,好比,對於正數0000 0001的一個補碼計算,class
首先取反碼成爲1111 1110,而後+1,變成1111 1111。全部-1的表示就是1111 1111硬件
那麼問題來了,八位整數中,若是首位表示正數,那麼最多就到127,沒法128,那麼-128是怎麼出來的?計算機
若是咱們假設1000 0000表示的是128,取反碼,獲得的是0111 1111,再加1有變成了1000 0000,也就是128的反碼就是它自己,128和-128是一個數。因爲在計算機中表示有符號數時,一般將最高有效位爲0的認爲是正數,最高有效位爲1的認爲是負數,所以1000 0000就表示爲-128了。因此8位有符號整數的範圍是-128~127。di
事實上,還有一個更好理解的方式,-127的表示方式爲1000 0001,那麼-128=-127-1view
即-128=1000 0001-0000 0001=1000 0000vi