需要澄清位移

hac*_*ock 2 c

void test()
{

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

}
Run Code Online (Sandbox Code Playgroud)

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

Mys*_*ial 8

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

表达方式:

(~0) >> 1
Run Code Online (Sandbox Code Playgroud)

评估类型int.

  • 因此~0正在评估0xffffffff(假设为32位).
  • 转变后,它变成:0x7fffffff.

存储到c(即unsigned char)时,它会截断到0xff哪个255.

为了得到127你想要的,你需要施放~0:

c = (unsigned char)(~0) >> 1;
Run Code Online (Sandbox Code Playgroud)

旁注:即使我们只是转换0unsigned char,结果仍然是255.这是因为隐式整数提升.所有小于的中间体int都被提升为int.

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