2013-12-12 55 views
0

所有主要開發系統(windows,Linux和Mac)上的float或double的格式和大小是否相同?float和double在不同平臺上

有什麼方法可以確保它們相互兼容嗎?例如,我可以通過使用int32_t作爲類型而不是int來確保int爲32位,但是對於float和double有沒有類似的技巧?

回答

1

沒有沒有:

1)格式:取決於你的架構的字節順序

2)尺寸:double被規定爲不小於float。其他任何事情都是允許的。

看到C標準:

§6.2.5.10

真的有三種FL浮動類型,指定爲浮動,雙和 長一倍。 float類型的值的集合是類型double的值集合的一個子集;類型爲double的兩組值的集合是long double類型的一組值的子集。

參見Any guaranteed minimum sizes for types in C?

+0

還有涉及最小範圍和精度的約束。並且排序不會影響格式;它只在你嘗試以字節數組訪問變量時發揮作用(並且實際上從來沒有任何理由這樣做)。 –

+0

@詹姆斯Kanze:這是一個很好的澄清,但我採取格式*意味着*字節安排。或許OP意味着尾數/指數的排列,正如我認爲你所做的那樣。 – Bathsheba

+0

OP實際上很可能意味着字節排列。在這種情況下,應該指出,這不是格式的一部分,因爲我今天知道的所有機器都將「float」和「double」視爲「單詞」,而不是字節序列。 –

0

這取決於你所說的「重大發展系統」的東西。 Windows和大多數Unix系統都使用IEEE float和double,所以它們 將使用相同的格式。大多數大型機(包括IBM)都使用 其他一些格式。

真正的問題是爲什麼你需要兼容性。如果你是 擔心可移植性,你不要使用int32_t,因爲 仍然有一些平臺不支持它。更多 一般情況下,除非特殊情況,您應該使用 int,並根據涉及 INT_MAXINT_MIN的表達式驗證輸入以確保不會發生溢出。

+0

Windows和Unix以及任何其他操作系統都不能確定數據類型的存儲方式。這些是編譯器(確定寬度)和CPU(確定佈局)的方面,有時也包括CPU和編譯器(對於支持多種佈局的體系結構)。 – mah

+0

@mah:你可以認爲它是實現的一個特性,因此直到編譯器(可能由CPU通知)。或者,您可以採取託管C++實現想要向程序員公開系統API的實際觀點,因此將使用操作系統的ABI或接近它。無論如何,就「extern」C「'鏈接而言,包括基本類型的佈局。實際的觀點對程序員來說更有用,例如,如果你在另一個架構上模擬一個架構,那麼純視圖就適用。 –

+0

@mah排序。 Windows只能在兼容英特爾的情況下運行,因此它使用英特爾表示。 Unix比較普遍,但是這個標準確實對體系結構有一些限制(最重要的是所有的指針都具有相同的大小和表示),但是可以有變種的事實是我說「大多數Unix系統」的原因。 (某些版本的Unix可以在IBM大型機上運行,​​並且它們不使用IEEE,但我懷疑大多數IBM大型機運行IBM操作系統,而不是Unix)。 –