2016-03-08 22 views
3

似乎沒有任何用於計算位類型大小的庫函數。sizeof(T)* CHAR_BIT是否可以保證位的大小?

我有權假定這可以通過以下方式完成嗎?

#include <climits> 

template <typename T> 
size_t Size_In_Bits(){ 
    return sizeof(T) * CHAR_BIT; 
} 

這是否總是返回可以在類型上定位的位數量?

+2

什麼是「可以針對某個類型的位」? – immibis

+1

@chux我已將C標籤更改爲C++。雖然,我想知道語言之間是否有區別。上面的實現可以改爲一個C宏,其中有limits.h –

+0

確信C/C++之間沒有大小差別。 – chux

回答

3

這保證給你大小(存儲)在比特,但不是寬度(值的比特的數量)。如果類型有填充位,後者可能會更少。對於無符號類型,您可以通過將-1轉換爲類型(以獲取類型中的最大可能值)並對它們進行計數來直接測量值的位數。對於簽名類型,std::numeric_limits<T>::max()可用於獲取最大值。或者,如果您已經知道具體類型,則可以使用limits.hstdint.hxxx_MAX宏。

+0

關於「將(無符號)-1轉換爲類型並對它們進行計數」以及「無法測量簽名類型中的值位數」的良好答案。 – chux

+1

「如果你知道它是哪種類型」 - 或者你可以使用std :: numeric_limits :: max()' – immibis

+0

哦,對不起,這個問題被標記爲C++而不是C.在這種情況下,我的答案有點不對。 。 –

2

sizeof(T) * CHAR_BIT返回類型在內存中佔用的位數。

然而,比特的大小可能大於整數可以在數學上使用的比特 - (考慮填充比特)。


詳細信息:整數有值位,符號位(有符號整數)和可能的填充位。所有這些位都有助於存儲大小。

unsigned char將永遠不會有填充位。

+1

調用這個「填充」極具誤導性。填充意味着C和C++中的其他東西。 –

+0

@BryryTheHatchet C規範§6.2.6.22調用額外的位「填充位」。這裏使用的「填充」在C和C++中沒有太大的誤導,因爲它在2個上下文中使用:這裏提到的位和結構的填充字節。 Answer重新調用它們來調用_padding bits_以幫助區分_padding bytes_。 IAC,依據語言規範,它仍然是_padding_的一種形式。 – chux

+0

也許是C規範的做法,但C++規範並沒有(根據與第29.6.5節有關memcpy行爲的非規範文本中的單個孤立提及)。然而,「填充位」仍然足以消除歧義,因此感謝添加第二個單詞。 –

相關問題