需要澄清位移

时间:2012-06-12 01:59:08

标签: c

void test()
{

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

}

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

2 个答案:

答案 0 :(得分:8)

文字0的类型为int。因此,整个表达式将被评估为类型int.

表达式:

(~0) >> 1

评估为int类型。

  • 因此~0正在评估0xffffffff(假设为32位)。
  • 班次变为:0x7fffffff

当您存储到cunsigned char)时,它会截断为0xff 255

要获得您期望的127,您需要投放~0

c = (unsigned char)(~0) >> 1;

旁注:即使我们仅将0投放到unsigned char,结果仍然是255。这是因为隐式整数提升。所有小于int的中间体都会升级为int

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

答案 1 :(得分:4)

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

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