提问者:小点点

右移无符号字符用1填充?


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

类似地,(无符号字符)-1>>1如预期的0111 1111。左边填满了一个零。

~((unsigned char)-1>>1)是预期的1000 0000。

例如,现在我想生成未签名的字符0010 0000。

我尝试了~((unsigned char)-1>>1)>>2,但输出1110 0000....怎么了?为什么左边突然被一个塞满了?

如何生成启用第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_TUINT16_T存在此问题,但对于UINT32_T或更高版本不再发生此问题。


共2个答案

匿名用户

另一种设置第N位的方法(从左侧开始):

1 << (CHAR_BIT - n - 1)

匿名用户

由于通常的算术转换,unsigned char在进行算术时被提升为int。即。(unsigned char)-1具有值255且类型为unsigned char

当向右移位时,左操作数被提升,提升后它将是int((unsigned char)-1>>1)的结果具有值127,因此类型为int。如果~(int)127,您将得到一个带有符号位设置的int;改变这种权利将产生实现定义的行为。

解决方案是在外部~周围添加强制转换:

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

或者,使用&包含0xFF的值。