2009-05-03 88 views

回答

14

這是C和C++語言規範中大小定義鬆散的結果。我相信C具有特定的最小尺寸,但在C++中唯一的規則是這樣的:

1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) 

此外,sizeof(int)sizeof(long)並非在所有平臺上相同的大小。我所使用的每個64位平臺都有適合自然字大小的long,所以32位體系結構上有32位,64位體系結構上有64位。

+3

Afaik windows 64位是個例外。它是LLP64,所以長= 32位,longlong 64位。它取決於你認爲更重要的實現者,保持sizeof(long)= sizeof(指針)或者保持sizeof(long)= sizeof(int)的代碼。 MS選擇了最後一個。 – 2009-05-03 16:06:48

3

int應該是體系結構的自然字大小。在過去,在原來的IBM PC等16位機器上,整數是16位,長整數是32位。在像68000系列這樣的32位機器上,整數仍然是「自然字長」,現在是32位,而長整數仍然是32位。隨着時間的推移,長達64位,然後我們開始使用64位體系結構,比如Intel Core 2,所以我預計int遲早會增長到64位。有趣的事實:在我的筆記本電腦上,Core 2 Duo和Mac OS X 10.5,int和long都是32位。在我的Linux機器上,還有Core 2 Duo和Ubuntu,int是32位,長是64位。

幾年前,我在求職面試中被問到一個int指針會在你添加3之後出現。我回答「3倍時間sizeof(int)過去現在的位置」。面試官強迫我說,我說這取決於體系結構,因爲(當時)Windows使用16位整數,但由於我在做Unix編程,我更習慣於32位整數。我沒有得到這份工作 - 我懷疑面試官不喜歡我比他更瞭解的事實。

+1

我不認爲核心2上的int是64位。我認爲只有很長時間了。至少,這是我在64位Debian上的經驗。 – Tom 2009-05-03 15:50:11

+0

你說得對,湯姆,我的MacBookPro上int和long都是4個字節。 – 2009-05-03 15:54:48

+1

它不是硬件,而是選擇的編譯器。根據操作系統和編譯器的不同,完全相同的硬件可能具有不同的int和長尺寸。在macosx中,Intel Core 2 Duo中的GCC將默認生成32位int/long。使用-m64選項將生成32b int和64b long(和指針)。 – 2009-05-03 16:33:19

8
  • int基本上是最方便快捷的整數類型
  • long是/是在最大的整數類型
  • short最小整型

如果最長整數類型也是最高效的,即intlong相同。前一陣子(認爲前32位),sizeof(int) == sizeof(short)在多個平臺上,因爲16位是最寬的自然的整數。

1

intlong並不總是相同的大小,所以不要認爲它們在代碼中。歷史上有8位和16位,以及更熟悉的32位和64位體系結構。對於嵌入式系統,較小的字大小仍然很常見。搜索網絡的ILP32和LP64的方式太多的信息。

3

由於Tom正確指出,C++中唯一的標準尺寸是char,其大小爲1(*)。從那裏開始,類型之間只有'不小於'的關係。大多數人會聲稱它取決於架構,但它更多是編譯器/操作系統的決定。運行MacOSX,Windows(32/64位)或Linux(32/64)的相同硬件對於相同的數據類型將具有不同的大小。同一架構中的不同編譯器 OS可以具有不同的大小。即使在相同硬件相同的操作系統完全相同的編譯器可以有不同的大小取決於編譯標誌:

$ cat test.cpp 
#include <iostream> 
int main() 
{ 
    std::cout << "sizeof(int): " << sizeof(int) << std::endl; 
    std::cout << "sizeof(long): " << sizeof(long) << std::endl; 
} 
$ g++ -o test32 test.cpp; ./test32 
sizeof(int): 4 
sizeof(long): 4 
$ g++ -o test64 test.cpp -m64; ./test64 
sizeof(int): 4 
sizeof(long): 8 

正在使用MacOSX上豹gcc編譯的結果。正如你所看到的,硬件和軟件是相同的,但兩個可執行文件的大小並不相同。

如果您的代碼依賴於大小,那麼您最好不要使用默認類型,而是使用編譯器的特定類型來確定大小。或者使用一些提供該支持的可移植庫(以ACE爲例):無論編譯器/ os /體系結構如何,ACE_UINT64都將是64位的無符號整數類型。該庫將檢測編譯器和環境,並在每個平臺上使用適當的數據類型。 (*)我已經重新檢查了C++標準3.9.1:字符大小應該足夠大以存儲實現的基本字符集的任何成員。後來:5.3.3:sizeof(char),sizeof(signed char)和sizeof(unsigned char)是1,所以是,char的大小是1個字節。

在閱讀其他答案後,我發現一個說bool是最小的整數類型。再一次,標準是鬆散的要求,只是說它可以代表truefalse但不是它的大小。該標準在這個範圍內是明確的:5.3.3,腳註:「sizeof(bool)不要求爲1」。

請注意,由於其他原因,一些C++實現已決定使用大於1個字節的bool。在使用gcc的Apple MacOSX PPC系統中,sizeof(bool)==4

相關問題