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) 时,它会截断为0xffwhich is 255。
要获得127您所期望的,您需要强制转换~0:
c = (unsigned char)(~0) >> 1;
旁注:即使我们只投射0to 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);
}