unsigned與signed區別


 
我們來一起看下,C語言中,對於Integer Type(整數形式)的unsigned與signed兩種形式的區別,以及在內存中的存儲方式是如何的 

Integer type(整數形式)是C語言中的基本數據形式之一,可以究竟對於Integer的定義是什么呢? 翻書看下,在介紹Integer的時候,還有一個關鍵詞就是size(范圍) 

The C Programming Language 寫道
an integer,typically reflecting the natural size of integers on the host machine

Programming in ANSI C 寫道
Integers are whole numbers with a range of values supported by a particular machine.


所以說,Integer是一個范圍內的所有整數,但是范圍是就特定計算機而言的(depends on computer).

開始之前,先來了解下很基礎的知識 - 計算機的存儲單位和整數存儲在計算機所占的內存大小。 
1).計算機最小的存儲單位是“位” 也就是bit或binary digits,用來存放一個二進制數,即 0或1。 8個二進制位為一個字節Byte。 
2).對於 16-bit(16位)的計算機,int是以兩個字節來儲存的,而32-bit的計算機,則是以4個字節,即32個bit來儲存的。 

如果想要明白singed與unsigned的區別,除了這兩個基本知識,還需要了解整數在計算機中的存儲方式,以16-bit 計算機為例,定義 int a = 1; 那么a的存儲方式用表格來表示 


0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1


首先需要提到的一點是,在C語言中十進制的整數都會轉化為二進制存儲在計算機。繼續,上面所聲明的 int a = 1,也就是 int signed a =1,C語言默認a是一個signed類型。 上面表格中最左端的為最高位,最右端的為最低位。signed類型的整數,只用了去除最高位,剩下的15位來進行編碼的,而最高位只是用來做標記(sign),標記整數的正負,0表示正,1表示負。所以對於signed的整數,的存儲范圍是(-2^15 to 2^15-1),也就是 -32768 到 +32767的整數。 
而對於unsigned的整數,其16位全部用來編碼,存儲范圍便是(0 to 2^16-1),即 0到 65535 的非負整數。所以呢 你可以聲明 int a = 1,或者 int a = -1, 但是不可以聲明 unsigned a = -1 。但是需要提到的一點是,不管整數的類型是signed 還是 unsigned,都用了16位來存儲,也就是說16位全部用來存儲數據 

上面所看到 a=1 的存儲方式,就是將十進制的a在 程序員計算器 上轉化為2字節的2進制,然后將這個結果放到上面的表格里。(原碼存儲) 
可是對於 int a = -1 是怎樣存儲的?也就是說負數的存儲方式是怎樣的? 
負數是以(補碼存儲),即是以原碼的補碼形式存儲,看下面的表格 

原碼
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

反碼
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0


反碼就是將原碼中的二進制1改為0,二進制0改為1。下面取得反碼之后,在反碼的基礎上加上1.即 
補碼
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1


不知道,說到這里,大家會不會有個疑惑,上面所說的signed與unsigned的范圍是有交集的,即都包含了0到+32767范圍的整數,那么這個范圍的整數在聲明為signed與unsigned的時候,存儲方式一樣嗎?答案是肯定的,在這個范圍內的整數,signed與unsigned 的存儲方式是一樣的。 

剛開始學C,我也不清楚弄明白這些編碼方式,存儲方式有什么意義,我現在個人覺得,只是在聲明int的時候,如果不能保證它的正整數性,就不要聲明為unsigned,當然可以保證的前提下聲明為unsigned,確實擴大了范圍。 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM