關於二進位制補碼表示法的一些備忘

2021-09-30 10:26:35 字數 977 閱讀 7136

幾乎所有的計算機都使用二進位制補碼表示法來儲存有符號整數,而不是用所謂的符號加絕對值表示法。

1)非負整數的二進位制補碼為其原樣,直接轉化為二進位制即為其二進位制補碼。

也就是說,當你定義乙個int n=1是,在計算機記憶體是以二進位制補碼的形式存放的,32位的cpu中,每個位的值為:0000....(總共31個0) 1  。

而如果是int n=-28;那麼在計算機記憶體中如何儲存?

2)負整數的二進位制補碼:絕對值取反後加1.

則為:-28的絕對值對應的二進位制表示:16+8+4=》11100 =》左邊補全0直至32位。也就是000...(27個0)11100.

取反:1111(27個11)00011

加1:1111(27個11)00100

故當看到乙個記憶體裡以1打頭的而且是int型別的資料,那麼首先可以判定,這是乙個負整數。

再舉一例:

int a=-2;

printf(「%u」,a);

會列印出多少呢?我們分析下:

-2在記憶體中首先以二進位制補碼的形式存放,也就是111...(30個1)10 這種序列存放(因為:-2絕對值二進位制:0000...(30個0)10 取反,111(30個1)01。加1:

也就是111...(30個1)10 。

而因為是以無符號整數形式輸出,故直接輸出乙個巨大的正整數:4294967294。

另外。。談一談二進位制補碼表示法的溢位。。

假設用4個位來表示整數,那麼其表示範圍為:1000(-8)~0111(7)。

那假設5+6在這裡我們期望的值是11,可是計算機相應為-5,這是為什麼呢?

原來。是因為11不在4個位表示的範圍裡。5(0101)+6(0110)=1011.這就是在儲存器裡邊的結果。然後當計算機把這個資料還原成整數時,步驟是:判斷正負,正的不進行操作,負數取其補碼。

很顯然,儲存時首位為1,這是負數,取補碼(取反後加1):0100+1=0101=5,加上符號:-5。。。

二進位制補碼的一些思考

最近都一直在看幾本關於計算機組成原理方面的大作 code the hidden language of computer hardware and software computer system a programer perspective introduction to computer sy...

關於二進位制補碼

問乙個基本的問題。負數在計算機中如何表示?舉例來說,8在計算機中表示為二進位制的1000,那麼 8怎麼表示呢?很容易想到,可以將乙個二進位制位 bit 專門規定為符號位,它等於0時就表示正數,等於1時就表示負數。比如,在8位機中,規定每個位元組的最高位為符號位。那麼,8就是00001000,而 8則...

關於二進位制補碼

問乙個基本的問題。負數在計算機中如何表示?舉例來說,8在計算機中表示為二進位制的1000,那麼 8怎麼表示呢?很容易想到,可以將乙個二進位制位 bit 專門規定為符號位,它等於0時就表示正數,等於1時就表示負數。比如,在8位機中,規定每個位元組的最高位為符號位。那麼,8就是00001000,而 8則...