void test()
{
unsigned char c;
c = (~0)>>1 ;
printf("c is %u\n",c);
}
Run Code Online (Sandbox Code Playgroud)
它打印255.我期待127,因为我期望在右移后最左边的位设置为0.这是因为我的编译器正在进行右旋转吗?
文字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)
旁注:即使我们只是转换0为unsigned char,结果仍然是255.这是因为隐式整数提升.所有小于的中间体int都被提升为int.
更多信息:https://www.securecoding.cert.org/confluence/display/seccode/INT02-C.+Understand+integer+conversion+rules
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |