long和int*究竟占幾位

风四娘 2024-06-20 05:36 1次浏览 0 条评论 taohigo.com

在32位環境中,char 8位,short 16位,int 32位,long 32位,int*(泛指指針)32位,long long 64位,float 32位,double 64位

在64位環境中,char 8位,short 16位,int 32位,long 64位,int*(泛指指針)64位,long long 64位,float 32位,double 64位

在32位與64位環境中,唯二的兩個不同就是long和指針類型的變量所占的空間大小。

但是如果你在64位的Windows下用vs的64位編譯器輸出sizeof(long),得到的結果是4。好像與理論不符,這是因為和編譯器的數據模型,MinGW是LLP64,long就是32位 int long short具體多少字節都是implement defined ,具體多少看編譯器實現,沒有絕對的多少,隻有同一個編譯器才保證大小一致。一般情況下windows64位一般使用LLP64模型,而64位Unix、Linux使用的是LP64模型。

然後,我們探究一下,為什麼在不同的操作系統下是32位或者是64位呢?

首先要知道,64位操作系統是指特別為64位架構計算機系統而設計的操作系統。

首先,我們要明白,指針就是地址,地址就是指針。而地址是內存單元的編號。所以,一個指針占幾個字節,等於是一個地址的內存單元編號有多長。

我們都知道,在計算機中,CPU不能直接與硬盤進行數據交換,CPU隻能直接跟內存進行數據交換。而CPU是通過數據總線、地址總線、控制總線三條線與內存進行數據傳輸與操作。

問:假如,我們想通過CPU在內存中讀取一個數字3,那麼是怎樣一個操作呢?

首先,CPU通過地址總線,在內存中找到數字3的地址;然後,通過控制總線知道該操作是讀還是寫;然後,通過數據總線,把數字3傳輸到CPU中。

我們可知道:

地址總線的寬度決定瞭CPU的尋址能力;

控制總線決定瞭CPU對其他控件的控制能力以及控制方式。

數據總線的寬度決定瞭CPU單次數據傳輸的傳送量,也就是數據傳輸速度;

我們平時所說的計算機是64位、32位、16位,指的是計算機CPU中通用寄存器一次性處理、傳輸、暫時存儲的信息的最大長度。即CPU在單位時間內(同一時間)能一次處理的二進制數的位數。假如,某計算機的地址總線是32位,那麼其一次可以處理的信息是32條,每一條地址總線有0或1兩種可能,那麼32根地址總線一共有232種可能,也就是其描述的地址空間為0x0000 0000 0000 0000 ~ 232-1。我們一般需要32個0或1的組合就可以找到內存中所有的地址,而32個0或1的組合,就是32個位,也就是4個字節的大小,因此,我們隻需要4個字節就可以找到所有的數據。所以,在32位的計算機中,指針占4個字節。同理,在64位的計算機中,指針占8個字節。

同時也可以看出,由於地址總線為32,那麼每次尋址的空間為0x0000 0000 0000 0000 ~ 2^32-1,那麼CPU的最大內存為2^32Byte=2^22KB=2^12MB=2^2GB=4GB。而64位,最大內存是2^64Byte。

數據存儲是以“字節”(Byte)為單位,數據傳輸大多是以“位”(bit,又名“比特”)為單位。

至於為什麼說16根地址總線的尋址空間為 2的16次方 = 64K(B),是因為字節(B)是內存的最小存儲單元,每個地址總線可以對2個存儲單元尋址(2B),所以16根地址總線可以尋址 2B的16次方 = 64K(B)

計算機能夠處理的最小單元是 字節 而不是 位

位,是由軟件通過位運算符操作的

為什麼32位的電腦內存可以超過4G?

早在16位系統上,系統可使用的內存就遠遠大於64K瞭,這是因為采用瞭內存分段和20位地址線。那麼在32位系統上,使用36位地址線也就是順理成章的事情。所以在當前x86架構中,32位系統最多可以使用128G的內存。

物理地址擴展,physical address extension,PAE。

這個功能可以將內存32bit的尋址空間擴展到48bit或者64bit。