2012-08-08 118 views
15

簡單地放入C和變體(與虛擬機不同,wuss java不同),不同目標上的原始類型的大小可能差別很大,除非您使用stdint.h中定義的固定寬度類型,你的實現必須支持他們。是否sizeof返回C中的字節數或類型的八位字節數?

無論如何假設(因爲在大多數現代機器上,一個字節是一個八位字節,爲了網絡的目的,我假設(ASCII))sizeof返回字節或八位字節的數據類型的大小?

+3

字節,但是一個字節(表示爲char)具有CHAR_BITS位。如果你需要'T'中的八位位組數,請執行'sizeof(T)* CHAR_BITS/8'。在大多數平臺上,'CHAR_BITS'是'8'。 – GManNickG 2012-08-08 15:46:17

+2

@GManNickG'CHAR_BIT'(沒有S):) – Praetorian 2012-08-08 15:55:45

+0

float octetPercent = sizeof(T)* CHAR_BIT /8.0; – awiebe 2012-08-08 16:05:55

回答

16

答案:sizeof返回類型的大小在字節


示例:sizeof(char)是100%保證是1,但是這並不意味着,它的一個八位字節(8個比特)。


由標準實踐證明:

在6.5.3.4

,點2:其操作數的

sizeof運算符產生的尺寸(以字節爲單位),其可以是 表達式或類型的括號內的名稱。大小由操作數的類型 決定。結果是一個整數。如果操作數的類型是可變長度數組 類型,則評估操作數;否則,操作數不會被評估,結果是一個整數常量 。

...

當應用於具有類型char,無符號的字符,或符號的字符, (或一個合格音響ED版本物)的結果是1一個操作數。當應用於數組類型爲 的操作數時,結果爲數組中的字節總數)應用於具有結構或聯合類型的操作數 時,結果爲此類對象中的總字節數 包括內部和尾部填充。

另外,在第3.6節,第3點:

一個字節的比特位構成的連續序列的,其數目是實現定義

+0

非常全面,謝謝你。 – awiebe 2012-08-08 16:37:39

4

sizeof總是返回大小作爲字節數。但根據wikipedia

在編程語言C和C++,一元運算符的sizeof用於計算任何數據類型的大小,在以代表類型所需要的字節數來測量。在這個上下文中的字節與無符號字符相同,並且可能大於8位,儘管這是罕見的

6

sizeof給出了大小以字節表示。但是請注意,「字節」是C標準中的一個技術術語,其定義如下:sizeof(char) == 1

1

從我自己的經驗,在嵌入式微控制器,具有異國情調的 'C' 編譯器的工作,我已經看到了:

sizeof(uint8) 

回報1

sizeof(uint16) 

回報1

sizeof(uint32) 

返回2

顯然,我正在處理一臺機器是最小的可尋址實體是16位,所以sizeof不符合C89或C99。

我會說主流C89 &符合C99的系統,接受的答案是正確的。 不幸的是,「C」編譯器仍然可以稱爲「C」編譯器,即使它不符合25年前的標準。我希望這個答案有助於在給定更多異域系統的情況下進行透視。

相關問題