右移无符号字符是否填充了字符?

在我的系统上,(unsigned char) -1是(预计为 8 位字符) 1111 1111 二进制(255 十进制)。

同样,(unsigned char) -1 >> 1正如预期的 0111 1111。左边填充了一个零。

~((unsigned char) -1 >> 1) 正如预期的那样,是 1000 0000。

现在我想生成 unsigned char 0010 0000 例如。

我试过了~((unsigned char) -1 >> 1) >> 2,但这输出 1110 0000 .... 什么?为什么左边突然被填满了?


如何生成unsigned char启用第 n 位(从左侧)的 ?

我想

n   unsigned char
0   1000 0000
1   0100 0000
2   0010 0000
3   0001 0000
... 
7   0000 0001

此刻,~((unsigned char) -1 >> 1) >> n正在给我

n   unsigned char
0   1000 0000
1   1100 0000
2   1110 0000
3   1111 0000
... 
7   1111 1111

这个问题存在于uint8_t, uint16_t,但不再发生在uint32_t和 更大。

回答

由于整数提升,当对值执行几乎任何操作时会unsigned char被提升int

当您右移时,左操作数会进行整数提升,unsigned char并将变为int. 表达式的值将是提升后左操作数的((unsigned char) -1 >> 1)值- 因此 的结果值为 127,类型为int。如果你~ (int)127会得到一个int带符号位的集合;转移该权利将具有实现定义的行为。

解决的办法是增加一个铸围绕~

(unsigned char)~((unsigned char) -1 >> 1) >> 2

或者,&值与0xFF

(~((unsigned char) -1 >> 1) >> 2) & 0xFF

至于设置 的n左起第 th 位unsigned char,最好的解决方案是 *left-shift1U到该位置,如Allan Wind所示。


以上是右移无符号字符是否填充了字符?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>