c語言中的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,確實擴大了范圍。

 

 

問題一:

 

c語言int類型占的字節數因不因機子是64位還是32位的而改變啊?

是和編譯器的位數有關,而不是操作系統或者CPU的位數

例如:
在16位編譯器(例如:TC)上,int型占2個字節
在32位編譯器(例如:VC,GCC,CFree等)上,int型占4個字節

問題二:32位和64位操作系統
32位和64位操作系統是指:CPU一次處理數據的能力是32位還是64位。現在市場上的CPU一般都是64位的,但是這些CPU並不是真正意義上的64 位CPU,里面依然保留了大部分32位的技術,只是進行
了部分64位的改進。32位和64位的區別還涉及了內存的尋址方面,32位系統的最大尋址空間是2 的32次方= 4294967296(bit)= 4(GB)左右,而64位系統的最大尋址空間的尋址空間則達到了2的
64次方= 4294967296(bit)的32次方=數值大於1億GB。換而言之,就是說32位系統的處理器最大只支持到4G內存,而64位系統最大支持的內存高 達億位數。

 


免責聲明!

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



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