2
void test()
{

    unsigned char c;
    c = (~0)>>1 ;  
    printf("c is %u\n",c); 

}

它打印 255。我期待 127,因为我期待右移后最左边的位设置为 0。这是因为我的编译器正在进行右旋转吗?

4

2 回答 2

8

文字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

更多信息:https ://www.securecoding.cert.org/confluence/display/seccode/INT02-C.+Understand+integer+conversion+rules

于 2012-06-12T02:04:03.997 回答
4

您的编译器将 ~0 视为 int,然后移位,然后转换为 unsigned char。该程序输出您的期望值:

void test()
{
    unsigned char c;
    c = ((unsigned char)(~0)) >> 1 ;  
    printf("c is %u\n",c); 
}
于 2012-06-12T02:03:52.217 回答