右移无符号字符是否填充了字符?
在我的系统上,(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所示。