[英]Unknown system bitsize for int, how to create mask
我只想為 MSB 創建一個掩碼,但是操作系統上的 int 的寬度應該是未知的,所以你不能假設 32 位。
見下文
// THE FOLLOWING FAILS BECAUSE OF SYSTEM IMPLEMENTING A LOGICAL
// RIGHT SHIFT
// Idea is
// 1. 0 inverted = all 1's
// 2. Arithmetic shift right
// 3. Then invert again to preseve MSB '1'
const int unsigned mask = ~(~0>>1); // FAIL, because of logic shift
您應該添加一個u
后綴以使移位的內容無符號,以便執行邏輯右移而不是算術右移。
const int unsigned mask = ~(~0u>>1);
您可以將(無符號)值1
左移類型中的位數減 1(即,對於 32 位類型,MSB 將為1 << 31
)。 要獲取位數,請結合使用sizeof
運算符和CHAR_BIT
常量(在<limits.h>
中定義):
const unsigned int MSB = 1u << (sizeof(unsigned int) * CHAR_BIT - 1);
INT_MAX
是所有實現的0111...1111
(某種寬度) *的int
位模式。
要形成1000...0000
,請反轉這些位。
~INT_MAX
以上涉及未定義的行為(UB)。
最好尋找無符號或更廣泛的類型。
unsigned mask = ~(unsigned) INT_MAX;
在稀有機器上, INT_MAX == UINT_MAX
等等,尋找更廣泛的類型:
long long = ~(long long) INT_MAX;
在稀有機器上(聞所未聞), INT_MAX == LONG_MAX
也是如此,那么我們就不走運了。
迂腐:稀有機器在int/unsigned
上使用填充,因此最好使用(U)INT_MAX
驅動代碼而不是sizeof
。
*也許也有一些填充位 - 非常罕見。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.