2014-07-24 57 views
4

我知道我可以信賴sizeof(char) == 1,但sizeof(uint32_t)sizeof(uint8_t)呢? 不應該是32位(8位)大小的名字猜測? 謝謝!我可以依靠sizeof(uint32_t)== 4嗎?

+1

如果'sizeof()'僅在這些情況下返回位而不是字節將會非常不一致。 –

+2

顯然,只要'CHAR_BIT == 8',你就可以。現在,如果不是那樣的話,找到一個架構並不容易。 – ach

+0

'sizeof()'返回字節數,'uint32_t'指定以位爲單位的寬度,所以基本上,目標平臺上一個字節的位數是多少?請參閱'CHAR_BIT'。 – Niall

回答

12

固定大小的類型將永遠是這個大小。如果你在一個不具有這種大小的整數類型的奇怪平臺上,那麼它們將是未定義的。

請注意,它不一定遵循sizeof(uint32_t) == 4,如果CHAR_BIT != 8;這隻會發生在奇怪的平臺上。

1

不,它完全依賴於你的編譯器和體系結構(即它會給你不同的結果,你沒有整數類型)。如果你得到CHAR_BIT == 8那麼是的,你可以依靠這一點。所以,如果你在64位體系結構上將與32位體系結構中的64位邊界對齊,那麼所有內容都將對齊到4個字節。

因此,如果數據大小很重要(例如一組位標誌),請始終使用固定大小類型。

+0

我不明白這一點。這是否意味着'malloc(sizeof(unit32_t)* x)'在64 vs 32 arch上請求「兩倍的空間」? – user2864740

+0

@ user2864740: - uint32_t的對齊要求必須小於或等於sizeof(uint32_t)。由於要求uintN_t類型中沒有填充,因此sizeof(uint32_t)* CHAR_BIT == 32.其他任何內容都不符合C99。 –

+0

那麼它是否依賴(如答案中)或保證(如評論中)uint32_t? :> – user2864740

11

絕對不是,至少關於sizeof(uint32_t)sizeof返回字節數,而不是位數 ,如果平臺上的字節是16位,則sizeof(uint32_t) 將是2,而不是4;如果一個字節是32位(並且實際上存在這樣的平臺 ),則sizeof(uint32_t)將是1(並且uint32_t 可以是到unsigned char的類型定義)。

當然,在這種情況下,uint8_t將不會被定義。

+0

但size_of返回*字節數*或*字符數*?當CHAR_BIT!= 8時它們是否是任何情況? – user2864740

+3

@ user2864740'sizeof(char)'保證等於1. – rightfold

+2

@ user2864740,在C/C++對象模型中,'char'是按字節定義的。 – ach

相關問題