C语言中-1右移问题
#include <stdio.h> int main(int argc, char** argv) { char ch = -1; ch = ch >> 1; printf("%d\n", ch); // -1 ch = -1; ch = ch >> 2; printf("%d\n", ch); // -1 ch = -1; ch = ch >> 3; printf("%d\n", ch); // -1 return 0; }
程序输出:
-1
-1
-1
首先写出-1的补码,1111 1111,由于char为有符号数,遵循有符号数右移的规则。
最高位补符号位,其它空出来的位也补符号位。
(1)-1右移1位,得111 1111,再补上符号位,最终得出1111 1111,为-1;
(1)-1右移2位,得11 1111,其它空出来1位补上1,得111 1111,再补上符号位,最终得出1111 1111,为-1;
(1)-1右移3位,得1 1111,其它空出来2位补上1,得111 1111,再补上符号位,最终得出1111 1111,为-1;