void test()
{
unsigned char c;
c = (~0)>>1 ;
printf("c is %u\n",c);
}
它打印255.我期待127,因为我期望在右移后最左边的位设置为0。这是因为我的编译器正在进行右旋转吗?
答案 0 :(得分:8)
文字0
的类型为int
。因此,整个表达式将被评估为类型int.
表达式:
(~0) >> 1
评估为int
类型。
~0
正在评估0xffffffff
(假设为32位)。0x7fffffff
。当您存储到c
(unsigned char
)时,它会截断为0xff
255
。
要获得您期望的127
,您需要投放~0
:
c = (unsigned char)(~0) >> 1;
旁注:即使我们仅将0
投放到unsigned char
,结果仍然是255
。这是因为隐式整数提升。所有小于int
的中间体都会升级为int
。
答案 1 :(得分:4)
您的编译器将〜0视为int,然后移位,然后转换为unsigned char。该程序输出您的预期值:
void test()
{
unsigned char c;
c = ((unsigned char)(~0)) >> 1 ;
printf("c is %u\n",c);
}