有關int與unsigned的區別

以前在學習C語言時一直沒有徹底的明白unsigned int 與int的區別,當時好像有一個概念就是負數用補碼來表示,而相應的補碼是通過把原碼取反後加1得到補碼,在其中符號位是不變的。今天到一本書上說,對於無符號數據來說,右移是邏輯的,也就是說在高位上是補0的,這個是肯定的,道理很明顯;而對於有符號的數據,其右移爲 算術的邏輯的都是可以的,不過基本上所有的編譯器與機器組合對於有符號數據都使用算術右移,也就是說高位補符號位。驗證如下:

在這裏取十進制數34來做爲例子,在這裏我纔想起來從原碼到補碼的算法,一開始還把符號位都變了,真是基礎知道不紮實啊。

34轉換成十六進制就是0X22,二進制爲00100010,

對於-34來說,對應的爲二進制原碼爲:1000 0000 0000 0000 0000 0000 0010 0010,其反碼爲:1111 1111 1111 1111 1111 1111 1101 1101,通過加1得到補碼,在機器中負數是通過補碼來表示的:1111 1111 1111 1111 1111 1111 1101 1110,十六進制爲0xffffffde;

接下來我把其右移3位,按理論上來說結果應該是:1111 1111 1111 1111 1111 1111 1111 1011,即0XFFFFFFFB。

驗證如下:

結果正確。

今天終於把這個早就應該明白的東西搞懂了。以前一直怕麻煩,或者說書上寫的是怎麼樣的就是怎麼樣,看過了就以爲自己明白了。其實不然,許多的小東西,只有你真正你實踐才能明白其中的真正的意思,在這個實踐的過程中會發現原來自己以爲自己很懂,但實際上沒懂的東西。加油,從基礎做起,從小事做起。

 

對於有符號與無符號的轉換,在這裏我用T表示有符號,U表示無符號,T2U即把有符號數轉換成無符號數,U2T無符號轉換成有符號數;

W表示位數,在這取W爲8,

有符號數的大小範圍爲:-2^(w-1)到2^(w-1)-1,即-128到127;

無符號數的大小範圍爲:0到2^(w)-1,即0到255;

 

當執行一個運算時,如果它的一個運算數是有符號的而另一個是無符號的,那麼C語言中會隱含地將有符號參數強制類型轉換爲無符號,並假設這兩個數都是非負的,來執行這個運算。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章