生手求详解!
新手求详解!!!!!
最近在看《深入理解计算机原理》,上面有一段讲到关于c语言的逻辑右移,和算术右移的问题,有一个题目:
0x75 为什么它的算术右移2位和逻辑右移2位是一样的?
------解决方案--------------------
逻辑右移(SHR)是将各位依次右移指定位数,然后在左侧补0,算术右移(SAR)是将各位依次右移指定位数,然后在左侧用原符号位补齐。
原符号位为0,所以一样
------解决方案--------------------
------解决方案--------------------
看来你完全没理解这两种移位
二进制数的补码表示法里,最高位为0表示正数,最高位为1表示负数,这就是符号位
逻辑右移就是把每一位向右移动一格,最左边空出来的那一位补0
但是这种移位在某些情况下会有问题,比如最高位原本是1表示负数,右移后就变成正数了
所以如果需要在右移的同时保持符号不变,就应该使用算术右移,算数右移别的和逻辑右移一样,唯一的区别是空出来的最高位补原符号位,原符号位是0就补0,原符号位是1就补1(而逻辑右移是一律补0)
所以你就知道,原最高位为0时,算数右移和逻辑右移是一样的,只有原最高位为1时,才有区别
最近在看《深入理解计算机原理》,上面有一段讲到关于c语言的逻辑右移,和算术右移的问题,有一个题目:
0x75 为什么它的算术右移2位和逻辑右移2位是一样的?
------解决方案--------------------
逻辑右移(SHR)是将各位依次右移指定位数,然后在左侧补0,算术右移(SAR)是将各位依次右移指定位数,然后在左侧用原符号位补齐。
原符号位为0,所以一样
------解决方案--------------------
#include <stdio.h>
unsigned char ui;
signed char si;
char main() {
ui=(unsigned char)0x80u;
si=( signed char)0x80;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
ui=ui>>1;
si=si>>1;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
printf("--------------\n");
ui=(unsigned char)0x80u;
si=( signed char)0x80;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
ui=(( signed char)ui)>>1;
si=((unsigned char)si)>>1;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
printf("==============\n");
ui=(unsigned char)0x80u;
si=( signed char)0x80;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
ui=ui<<1;
si=si<<1;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
printf("--------------\n");
ui=(unsigned char)0x80u;
si=( signed char)0x80;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
ui=(( signed char)ui)<<1;
si=((unsigned char)si)<<1;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
return 0;
}
//ui=128
//si=-128
//ui=64
//si=-64
//--------------
//ui=128
//si=-128
//ui=192
//si=64
//==============
//ui=128
//si=-128
//ui=0
//si=0
//--------------
//ui=128
//si=-128
//ui=0
//si=0
------解决方案--------------------
看来你完全没理解这两种移位
二进制数的补码表示法里,最高位为0表示正数,最高位为1表示负数,这就是符号位
逻辑右移就是把每一位向右移动一格,最左边空出来的那一位补0
但是这种移位在某些情况下会有问题,比如最高位原本是1表示负数,右移后就变成正数了
所以如果需要在右移的同时保持符号不变,就应该使用算术右移,算数右移别的和逻辑右移一样,唯一的区别是空出来的最高位补原符号位,原符号位是0就补0,原符号位是1就补1(而逻辑右移是一律补0)
所以你就知道,原最高位为0时,算数右移和逻辑右移是一样的,只有原最高位为1时,才有区别