在我的系统中,(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_T
、UINT16_T
存在此问题,但对于UINT32_T
或更高版本不再发生此问题。
另一种设置第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
的值。