2012-10-31 23 views
2

我期待着我自己的算術類型(例如Byte8,Int16,Int32,Float754等),以確保它們包含特定數量的位(並且在這種情況下的浮點數,堅持IEEE754格式)。我怎樣才能以完全跨平臺的方式來做到這一點?如何保證C++類型的位數

我見過的C/C++標準,在這裏和那裏片段,並有很多的:

至少X字節」

並不算大的:

類型恰好X由TES」。

鑑於typedef Int16 unsigned short int可能不一定會導致16位Int16,是否有跨平臺的方式來保證我的類型將具有特定的大小?

+0

可以使用模板在編譯時驗證所選類型是否正確sizeof(),如果不嘗試沿線查找,直到找到匹配的模板爲止。 –

回答

7

您可以使用在<cstdint>中聲明的精確寬度整數類型int8_t, int16_t, int32_t, int64_t。這樣,尺寸在所有平臺上都是固定的

+3

...提供它們的所有平臺。如果平臺沒有*(例如)16位類型,那麼它就不會有'int16_t'。 –

+0

通過使用「至少X位」類型(http://en.wikibooks.org/wiki/C_Programming/C_Reference/stdint.h#Minimum)可以輕鬆解決「沒有我想要的尺寸」 -width_integer_types)。當然,原始問題排除了「**類型**在_least_ ** x **字節」。 –

4

查看stdint.h中聲明的類型。這是standard library的一部分,因此預計(儘管技術上不能保證)可在任何地方使用。這裏申報的類型是int8_t,uint8_t,int16_t, uint16_t,int32_t,uint32_t, int64_tuint64_t。本地實現將這些類型映射到給定編譯器和體系結構的適當寬度類型。

4

這是不可能的。

有一些平臺,其中char是16甚至32位。

請注意,我並不是說理論上有這種情況發生的平臺......這是一個真實且相當具體的可能性(如DSP)。

在這種硬件上,只有8位只用於操作,例如如果你需要8位模塊化算術,那麼唯一的辦法就是自己做一個掩碼操作。

C語言不提供這種仿真你的...

使用C++,你可以嘗試建立一個行爲像預期 本地 基本在大多數情況下類型的類(用排除法顯然是sizeof)。結果將會有非常可怕的表現。

我可以認爲沒有使用這種方式強制硬件不符合其性質的情況下是一個好主意。

+0

然而,在編譯時可能會驗證該類型是否具有一定的大小,因此對於某些平臺,您根本無法讓程序編譯。 –

5

唯一可用這樣才能真正保障位的確切數目是使用位字段:

struct X { 
    int abc : 14; // exactly 14 bits, regardless of platform 
}; 

上有一些大小上限,您可以指定這樣 - 至少16位對於int,對於long爲32位(但現代平臺可容易地允許高達64位)。然而請注意,儘管這保證了X::abc上的算術將使用(或至少仿真)正好14位,但確保而不是保證struct X的尺寸是提供14位所需的最小字節數(例如,給定8位字節,其大小可以很容易地是4或8,而不是絕對必要的2)。

C和C++標準現在都包含固定大小類型的規範(例如,int8_t,int16_t),但不保證它們將存在。如果平臺提供正確的類型,則需要它們,否則將不存在。如果內存服務,這些也需要使用2的補碼錶示,所以具有16位1的補碼整數類型的平臺(例如)仍然不會定義int16_t

3

可以在編譯時使用C++模板來檢查並創建適合您需求的新類型,具體而言,該類型的sizeof()是您想要的正確大小。

看看這段代碼:Compile time "if"

請注意,如果請求的類型不可用,那麼完全有可能您的程序無法編譯。這取決於是否適合你。