首页 > 解决方案 > int的未知系统位大小,如何创建掩码

问题描述

我只想为 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

标签: cbitmaskportability

解决方案


您应该添加一个u后缀以使移位的内容无符号,以便执行逻辑右移而不是算术右移。

const int unsigned mask = ~(~0u>>1);

推荐阅读