剛剛在OSX上注意到了這一點,我發現它很好奇,因爲我預計它會比int更長。 有沒有什麼好的理由讓它們尺寸相同?我注意到ints和longs有相同的大小。爲什麼?
回答
這是C和C++語言規範中大小定義鬆散的結果。我相信C具有特定的最小尺寸,但在C++中唯一的規則是這樣的:
1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
此外,sizeof(int)
和sizeof(long)
並非在所有平臺上相同的大小。我所使用的每個64位平臺都有適合自然字大小的long
,所以32位體系結構上有32位,64位體系結構上有64位。
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位整數。我沒有得到這份工作 - 我懷疑面試官不喜歡我比他更瞭解的事實。
我不認爲核心2上的int是64位。我認爲只有很長時間了。至少,這是我在64位Debian上的經驗。 – Tom 2009-05-03 15:50:11
你說得對,湯姆,我的MacBookPro上int和long都是4個字節。 – 2009-05-03 15:54:48
它不是硬件,而是選擇的編譯器。根據操作系統和編譯器的不同,完全相同的硬件可能具有不同的int和長尺寸。在macosx中,Intel Core 2 Duo中的GCC將默認生成32位int/long。使用-m64選項將生成32b int和64b long(和指針)。 – 2009-05-03 16:33:19
int
基本上是最方便快捷的整數類型long
是/是在最大的整數類型short
是最小整型
如果最長整數類型也是最高效的,即int
與long
相同。前一陣子(認爲前32位),sizeof(int) == sizeof(short)
在多個平臺上,因爲16位是最寬的自然的整數。
int
和long
並不總是相同的大小,所以不要認爲它們在代碼中。歷史上有8位和16位,以及更熟悉的32位和64位體系結構。對於嵌入式系統,較小的字大小仍然很常見。搜索網絡的ILP32和LP64的方式太多的信息。
由於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是最小的整數類型。再一次,標準是鬆散的要求,只是說它可以代表true和false但不是它的大小。該標準在這個範圍內是明確的:5.3.3,腳註:「sizeof(bool)不要求爲1」。
請注意,由於其他原因,一些C++實現已決定使用大於1個字節的bool。在使用gcc的Apple MacOSX PPC系統中,sizeof(bool)==4
。
- 1. 爲什麼TextAppearance和TextAppearance.Small具有相同的文本大小?
- 2. 爲什麼Int64和UInt64具有相同的大小
- 3. 爲什麼我的繪圖大小相對於畫布大小?
- 4. 爲什麼字符串應用gzcompress和gzuncompress的大小相同?
- 5. 爲什麼文檔大小和窗口大小在加載時是相同的?
- 6. 爲什麼不同大小的圖像在numpy中的大小相同?
- 7. 爲什麼相同的代碼大小產生不同大小的exe文件
- 8. 爲什麼具有相同數據的列表具有不同的大小?
- 9. 爲什麼不同結構大小的輸出是相同的?
- 10. SQL Server:爲什麼不同備份的大小相同?
- 11. 爲什麼我會得到不同的HTML表格大小?
- 12. 爲什麼我沒有注意到文件從FileSystemWatcher重命名
- 13. 爲什麼花車和ints = Nan?在去
- 14. 數組的大小和指針的大小是什麼意思?
- 15. 爲什麼Firebase默默地將我的Longs轉換爲Integers?
- 16. 相同的文件,相同的文件大小,但兩種不同的內存大小,爲什麼?
- 17. 爲什麼矢量具有不同的容量和大小?
- 18. 爲什麼根窗口小部件不具有相同的窗口大小?
- 19. 爲什麼我的數據庫文件與普通文本文件具有相同數據的大小相同?
- 20. 爲什麼具有*的WPF Grid中的兩列不具有相同的大小?
- 21. 爲什麼WinDbg爲c#類和結構顯示相同的大小?
- 22. 爲什麼不同大小的文字有不同的排列
- 23. 爲什麼字符數組的大小相同使用sizeof()
- 24. 這些表爲什麼是相同的大小?
- 25. ViewPager和Fragments:爲什麼我總是看到相同的東西?
- 26. 爲什麼sizeof爲不同的變量報告相同的大小(8字節)?
- 27. 有什麼辦法讓我的「斜線」與字體的大小相同
- 28. 爲什麼父母的div沒有與包含的圖像相同的大小?
- 29. 添加到數組隨機Ints和獲取最大和最小
- 30. 添加更多數據後,爲什麼我的文件大小相同?
Afaik windows 64位是個例外。它是LLP64,所以長= 32位,longlong 64位。它取決於你認爲更重要的實現者,保持sizeof(long)= sizeof(指針)或者保持sizeof(long)= sizeof(int)的代碼。 MS選擇了最後一個。 – 2009-05-03 16:06:48