2013-12-21 59 views
15

我只是想知道如何知道我的筆記本電腦是64位還是32位機器。 (這是一個64)。64位機器上int和sizeof int指針的大小

所以,我認爲有關打印以下:

int main() 
{ 
printf("%d",sizeof(int)); 
} 

,結果爲4,這似乎怪異(因爲它是一個64位的機)

但是,當我印刷這樣的:

int main() 
{ 
printf("%d",sizeof(int*)); 
} 

結果爲8,這使得更多的意義。

的問題是:

由於我使用64位機,應該不是原始類型如int應該使用8個字節

(64位)和由INT的sizeof應8?爲什麼不是這樣?

爲什麼int *大小是8?

有點困惑在這裏,

所以在此先感謝。

+7

不要使用'%d'打印'size_t',它會調用UB。 – 2013-12-21 16:56:11

+1

http://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models – Mat

+1

與32位相比,64位體系結構不會改變整數模型。只有地址/指針長度。 – user2672165

回答

18

不,sizeof(int)是實現定義的,通常是4個字節。另一方面,爲了解決超過4GB的內存(即32位系統可以做到的),您需要指針的寬度爲8個字節。 int*只是將地址保存在「內存中的某處」,並且無法使用32位尋址超過4GB的內存。

+2

注意:代碼,常量數據,堆棧,動態數據,各種數據類型等的內存可能存在於單獨的隱含_segments_或地址空間中,因此每個的地址可以是32位,而_each_有4GB。總共超過4GB。這個模型意味着函數地址和數據地址具有相同的「值」,但它們的隱含段不同,會有不同的比較。考慮[哈佛體系結構](https://en.wikipedia.org/wiki/Harvard_architecture)受各種嵌入式處理器的歡迎。 C可以移植到許多地址方案。 – chux

+0

這是否意味着使用'int * t = malloc(sizeof(int))'而不是'int i = 1; int * t =&i'? – wulfgarpro

15

在任何64位C/C++編譯器上,指針的大小應該是8個字節,但對於int的大小,其大小也應該是8個字節。

wiki有一個很好的解釋:在 64位機器

在C和C衍生語言許多編程環境,「INT」變量仍然是32個位寬,但長期 整數和指針是64位寬。這些被描述爲具有 的LP64數據模型。另一種選擇是在 的ILP64數據模型,所有的三種數據類型爲64個位寬,並且甚至SILP64其中 「短」的整數同樣64個位寬。[引證需要]然而,在 大多數情況下所需要的修改是相對較小的和 直截了當,許多精心編寫的程序可以簡單地爲 重新編譯爲新的環境沒有變化。另一個 替代方案是LLP64模型,它通過使兩個int和長爲32位保持與 32位代碼的兼容性。 「LL」表示 「long long integer」類型,它在所有平臺上至少包含64位,包括32位環境在內的 。

3

sizeof(int)sizeof(int*),和「機器大小」,雖然經常彼此關聯,可以各自獨立地小於其他中,相同的或更大。關於唯一的C要求是它們至少需要16位(除此之外) - 除此之外,編譯器依賴於sizeof(int),sizeof(int*)

(雖然也許一個指針必須是至少一個int大小。HMMM)

+0

那麼,爲什麼sizeof(char *)在某些情況下也會給出「8」? –

+0

@UdbhavKalra在某些情況下,sizeof(char *)是8,因爲指向char的指針的大小是8.在更新穎的平臺上,它可能是4,2或者甚至1,3或6。 8你覺得有問題嗎? – chux

+0

我只是測試了sizeof(int *)(char *),在我的平臺上只給了8。那麼,我認爲可能是什麼原因呢? –

2

程序員希望有整數類型的1,2,4和8個字節或8,16,32和64位。只有兩個整數類型可以比int小:char和short。如果int是64位,那麼你不可能擁有全部三種大小的8,16和32位。這就是爲什麼編譯器傾向於使int = 32位,所以你可以有char = 8位,short = 16位,int = 32位,long long = 64位和long = 32位或64位。

0

因爲爲size_t是定義爲

typedef unsigned int size_t; 

你應該%祖,%u或%lu個,而不是%d顯示。

printf("%zu\n", sizet); 
printf("%u\n", sizet); 
printf("%lu\n", sizet); 
+1

'size_t'沒有被定義爲'unsigned int'。 'size_t'是一些無符號整數類型,在_least_ 16位寬。使用'printf(「%zu \ n」,sizet);'是正確的,其他人可以調用未定義的行爲。 – chux