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