2012-07-16 34 views
5

我需要一種跨體系結構的方式來確保浮點數爲4個字節(就像在32位窗口上一樣)。例如,在我創建的結構中,我使用而不是int來確保一個長度爲4個字節的整數值。確保浮點大小爲4字節的C++

我怎麼能用浮子做這個?我知道我可以用類型替換該值;然而,當在64位系統上強制轉換爲float時,我不會遇到問題嗎?

+5

該標準甚至不保證存在4字節的'float'。但是我想象一下,找到一個sizeof(float)!= sizeof(int32_t)''的架構是非常困難的。 – Mysticial 2012-07-16 02:16:51

+2

我有個壞消息:'__int32'不是跨平臺的。 – 2012-07-16 02:18:10

+4

*旁白*:'__int32'不保證存在於每個(或任何)系統上。改爲嘗試'int32_t'。 – 2012-07-16 02:18:16

回答

7

我需要一個跨架構的方法來確保float將是4個字節

對於浮點值,沒有類似int32_t

實現所需目標的唯一跨平臺方法是使用運行時或靜態斷言進行測試。

#include <cassert> 
int main() { 
    assert(sizeof(float) == 4); 
    // If control reaches this line, then you've 
    // ensured that float is 4 bytes. 


    // rest of your program goes here 
} 
+2

如果大小不是4字節,那隻會殺死程序。 – Qix 2012-07-16 02:18:12

+0

沒錯。如果'float'不是4個字節,你希望它做什麼? – 2012-07-16 02:19:07

+0

我*需要*浮點數爲4個字節。 – Qix 2012-07-16 02:19:41

3

由於浮點數據大小與CPU有關,所以沒有符合標準的方法來執行此操作。 IEEE-754標準(支持浮點的所有處理器都使用我所知)將單精度浮點值定義爲4字節。

沒有標準提及的原因是因爲C的編寫者不想將自己綁定到浮點的特定實現上,以防標準更改或更新。而且還因爲CPU決定了單精度浮點數和雙精度浮點數的大小和實現,所以它不是編譯器關心的問題。

如果您擔心,可以使用static_assert以確保sizeof(float) == 4;不過,這不是你要碰到的問題,我不會想象。如果是這樣,你應該在個案的基礎上處理它(這實際上是一個逐架構的基礎)。

+0

這很合理。我將不得不更多地閱讀IEEE-754標準(每個人都會圍繞這些標準進行討論,但我仍然試圖瞭解它們是什麼以及它們如何相互配合)。 – Qix 2012-07-16 02:39:20

+0

如果你還在身邊,你應該把接受的答案提供給Rob-phi。我只是擴大了他的答案。 – OmnipotentEntity 2012-07-16 02:45:43