2013-01-21 66 views
-1

我使用std :: uint32_t,由於某種原因,它的數據類型與unsigned long不同,它是我的平臺(ARM Cortex M4 K20)上的無符號32位...任何想法?stdint.h中的C++標準類型大小

沒關係我想有時候你想可變大小類型:

typedef unsigned short Integer16; 
typedef std::uint32_t Integer32; 

typedef unsigned int FastInteger16; 
typedef unsigned long FastInteger32; 

這個什麼問題嗎?

+1

'sizeof()'報告兩種類型的是什麼? – cdhowie

+0

4對unsigned long和std :: uint32_t ... –

+2

@RyanBrown:所以'uint32_t'是一個32位的類型,因爲它應該是。有什麼問題? –

回答

2

類型std::uint32_t應該是正好32位和一個無符號整數。

但是這意味着它可以是unsigned intunsigned long
這些值可能都是32位長(取決於實現)。

或禁止任何方式來定義告訴我,如果std :: uint32_t不是32位,所以我可以有條件地重新定義基本類型?

類型std::uint32_t定義爲32位。如果您的平臺沒有32位無符號整數類型,則可以定義此類型並且不可用。

+1

這個答案似乎不符合問題... –

1

你想要的代碼是:

#if (typeid(std::uint32_t) == typeid(unsigned long)) 
    typedef unsigned long Integer32; 
#else 
    typedef std::uint32_t Integer32; 

它不合法的,但你想說的是什麼,換句話說,「如果uint32_t意味着unsigned long,然後Integer32手段unsigned long否則,就意味着無論uint32_t。手段」。

這相當於:因爲你是走樣Integer32這兩種情況下

typedef std::uint32_t Integer32; 

意味着同一類型uint32_t手段。所以就寫這個吧。

確保uint32_t是符合實現的無符號32位類型。由於您的實施不是unsigned long,因此幾乎肯定是unsigned int。即使它們的尺寸相同,這兩種類型即unsigned longunsigned int也是不同的類型。相比之下,uint32_t是一個typedef,因此它與typedefed的含義相同。

要回答你的新問題:

typedef unsigned short Integer16; 

unsigned short可能不會恰好是16位(雖然沒有很多的實現,取決於它是不是)。如果你想要一個精確的16位無符號類型,那麼這就是uint16_t的用途。這是一種可選類型,所以在沒有合適類型的實現中,您的代碼會導致信息錯誤,這幾乎與您所能做的一樣。

typedef std::uint32_t Integer32; 

好的,警告uint32_t是一個可選類型。如果你喜歡Integer32那麼你可以自由使用它。

typedef unsigned int FastInteger16; 

使用std::uint_fast16_t而不是unsigned int如果你想至少爲16位的快速無符號整數。

typedef unsigned long FastInteger32; 

使用std::uint_fast32_t而不是unsigned long如果你想至少32位的快速無符號整數。

+0

我猜typeid是一個函數,並且定義了不能執行函數,至少那個代碼在'function call not'允許在一個常量表達'。 –

+0

@Ryan:'typeid'是一個操作符,而不是一個函數。但是你是正確的,你不能在預處理器條件中使用它。我猜錯誤說「函數」的原因是預處理器正在報告錯誤,並且預處理器不知道雖然'typeid(X)'看起來像函數調用,但它不是一個。 –