c语言中关于右移运算的问题

 #include<stdio.h>
main()
{
    int x=58,y=-58;
    x=x>>3;                                     /*xсррф3н╩*/
    y=y>>3;                                     /*yсррф3н╩*/
    printf("the result1 is:%d,%d\n",x,y);
    x=x>>2;                                     /*xсррф2н╩*/
    y=y>>2;                                     /*xсррф2н╩*/
    printf("the result2 is:%d,%d\n",x,y);
}

为什么-58右移3位的结果是-8?再右移2位是-2?

这个与负数的存储方式有关。
机器对于二进制的存储方式为补码表示法,这里假定是16bits的机器字长。如-58二进制表示则是(1111 1111 1100 0110)。
左移默认补0,右移补符号位(即若符号位为0则补0,若符号位为1则补1)
-58右移3位,那么二进制数(1111 1111 1100 0110)右移3位为(1111 1111 1111 1000),对应的十进制数则是-8。
此时-8再右移两位,那么二进制数(1111 1111 1111 1000)右移2位为(1111 1111 1111 1110),对应的十进制数则是-2。

纠正一下:第一行中机器对于二进制的存储方式为补码表示法改成如下:
机器对于负数的表示采用补码表示法

楼上正解 主要就是数据的存储方式 和 算数移位