c – 在将大型值分配给小型时,是否需要使用位掩码?

假设我想将uint32_t的低16位存储在
Windows上的uint16_t中,我可以这么做

uint32_t value = 123456789;
uint16_t low1 = value; //like this
uint16_t low2 = value & 0xFFFF; //or this

结果似乎没有差异,但我找不到任何明确说明这是定义行为的文档.情况X或Y可能有所不同吗?或者这只是它的工作原理?

最佳答案 C标准保证无符号类型的赋值和初始化为您提供模2n的值,其中n是无符号类型的值表示中的位数.

在Windows中,所有位都参与值表示.

因此,使用位掩码没有任何意义,除了在将来可能会改变类型时为未来设置一点绊脚石.

如果你绝对想要使用面具,例如为了避免来自过度热心的编译器的编译警告,那么你可以像这样以类型无关的方式进行,假设类型是无符号的:

uint16_t low2 = value & uint16_t(-1);

这取决于前面提到的modulo-2n保证.

点赞