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;

原文地址:https://www.cnblogs.com/Robotke1/p/3075684.html