似乎沒有任何用於計算位類型大小的庫函數。sizeof(T)* CHAR_BIT是否可以保證位的大小?
我有權假定這可以通過以下方式完成嗎?
#include <climits>
template <typename T>
size_t Size_In_Bits(){
return sizeof(T) * CHAR_BIT;
}
這是否總是返回可以在類型上定位的位數量?
似乎沒有任何用於計算位類型大小的庫函數。sizeof(T)* CHAR_BIT是否可以保證位的大小?
我有權假定這可以通過以下方式完成嗎?
#include <climits>
template <typename T>
size_t Size_In_Bits(){
return sizeof(T) * CHAR_BIT;
}
這是否總是返回可以在類型上定位的位數量?
這保證給你大小(存儲)在比特,但不是寬度(值的比特的數量)。如果類型有填充位,後者可能會更少。對於無符號類型,您可以通過將-1轉換爲類型(以獲取類型中的最大可能值)並對它們進行計數來直接測量值的位數。對於簽名類型,std::numeric_limits<T>::max()
可用於獲取最大值。或者,如果您已經知道具體類型,則可以使用limits.h
或stdint.h
的xxx_MAX
宏。
sizeof(T) * CHAR_BIT
返回類型在內存中佔用的位數。
然而,比特的大小可能大於整數可以在數學上使用的比特 - (考慮填充比特)。
詳細信息:整數有值位,符號位(有符號整數)和可能的填充位。所有這些位都有助於存儲大小。
unsigned char
將永遠不會有填充位。
調用這個「填充」極具誤導性。填充意味着C和C++中的其他東西。 –
@BryryTheHatchet C規範§6.2.6.22調用額外的位「填充位」。這裏使用的「填充」在C和C++中沒有太大的誤導,因爲它在2個上下文中使用:這裏提到的位和結構的填充字節。 Answer重新調用它們來調用_padding bits_以幫助區分_padding bytes_。 IAC,依據語言規範,它仍然是_padding_的一種形式。 – chux
也許是C規範的做法,但C++規範並沒有(根據與第29.6.5節有關memcpy行爲的非規範文本中的單個孤立提及)。然而,「填充位」仍然足以消除歧義,因此感謝添加第二個單詞。 –
什麼是「可以針對某個類型的位」? – immibis
@chux我已將C標籤更改爲C++。雖然,我想知道語言之間是否有區別。上面的實現可以改爲一個C宏,其中有limits.h –
確信C/C++之間沒有大小差別。 – chux