2013-10-18 44 views
0

我知道這個問題已經被問了很多,但我從來沒有見過一個適合我需要的適當答案。我正在編寫一個編譯器和解釋器,以便在C++中獲得樂趣,並且爲了編寫它們,我需要確保我使用的類型是8位,32位,64位等等......我發現了,但是我已被警告說它可能不適用於所有平臺。我也聽說有些平臺不支持這些大小的整數,但它必須是可能的,因爲java設法實現這一點。不幸的是,Java源代碼不可用。使用精確大小的整數C++

+2

Java編譯代碼不適用於「所有平臺」。它適用於獨立於計算機體系結構的JVM平臺。所以,這並不是說「java能夠實現這個目標」,但它甚至不嘗試這樣做。 – SJuan76

+0

但java在所有主要平臺上都可用,並且其類型始終是相同的大小。 – Popgalop

+0

但是在內部,JVM可能在一個平臺上使用int64作爲「java integer」,而在另一個平臺上使用int32。 – SJuan76

回答

2

爲什麼你需要確保你使用的類型正好是32 位等。在編譯器或解釋器中這當然是不必要的。 (您可能需要int_least32_t,這取決於但 通常情況下,你需要使用int無處不在,讓編譯器 將工作無處不在---儘管有些項目可能是因爲它太大 一個16位的機器上。)

至於便攜性:如果你是爲了好玩而做的,唯一需要擔心的 平臺是PC。但即使你想要 擴展到普通的Unix平臺,你也會發現 類似int32_t也可以在那裏使用。關於唯一的 的地方,你不會找到他們是在一些異國情調的大型機和一些嵌入式系統 。 (這兩者都不會被Java支持, )

6

<stdint.h><cstdint>上C++)標頭包含typedef s表示服從特定尺寸:

int8_t x; 
int16_t y; 
int32_t z; 

如果typedef的不存在,則該平臺不支持它。要檢查它,您有一些可用的宏,如INT16_MININT16_MAX,它定義了指定整數的最小值和最大值,以便您可以親自看到它。

+0

這些類型是可選的,如果實現不能提供它們,則不需要在那裏。 – PlasmaHH

+0

太棒了,但請不要鏈接到該網站。 –

+0

@LightnessRacesinOrbit cplusplus.com有什麼問題? –

2

準確的尺寸類型是由C99標準定義的,在stdint.h頭文件中(看看here)。您只需要一個兼容C99的編譯器,如現代GCC和Clang。在C++中,改用cstdint

此外,在OpenJDK源代碼公開發布,你可以下載或提供on the project page和研究它的鏈接瀏覽它。

編輯:有少數平臺(異國情調,嵌入式或非常非常古老),不宣佈或支持這些類型。在這些方面,不可能獲得確切的大小類型,但如果不是現在使用的家庭/企業處理器,您仍然可以定位大部分,而不必擔心。

+2

請在C++中使用'cstdint'。 –

+0

是的,絕對正確。添加到答案中。 –

+1

這並沒有解決他的問題:當確切的尺寸類型不可用時該怎麼做。他們不支持每個平臺。 –

0

由於C++ 11已經發布,所以有Fixed width integer types可以讓你的類型至少有你想要的大小。

+0

但如果字體大小發生變化,那麼在一個系統上編譯的文件將與另一個系統編譯時不兼容 – Popgalop

+0

@Popgalop在一個系統上編譯的文件通常與另一個系統上編譯的文件不兼容。與尺寸無關。 –

+0

固定寬度的整數類型不保證存在。 (OP顯然知道'',並且確切的寬度類型在某些架構上不可用。) –