簡體   English   中英

int的未知系統位大小,如何創建掩碼

[英]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

假設 16 位系統

  1. ~0 給 FFFF
  2. ~0>>1 給 7FFF
  3. ~(~0 >> 1) 給 8000

您應該添加一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM