关于原码,反码,补码和左右移位的若干思考

来源:互联网 发布:linux中的magic number 编辑:程序博客网 时间:2024/06/10 05:03
1.为什么要使用原码,反码,补码

1)负数二进制怎么表示?
答:在原码中,高位为1就表示负数

2)计算机如何实现减法?
1-1=?
答:对于计算机,逻辑运算应该设计的简单,1-1可以表示为1+(-1),故没有减法,用加法实现减法。

1 - 1 = 1 + (-1) = [00000001] + [10000001] = [10000010] = -2

如果用原码表示, 让符号位也参与计算, 显然对于减法来说, 结果是不正确的.这也就是为何计算机内部不使用原码表示一个数.

为了解决原码做减法的问题, 出现了反码:

计算十进制的表达式: 1-1=0

1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0


3)0的二进制怎么表示,+0和-0有区别吗?
答:+0和-0,但是补码都为0,计算机中使用的是补码,故计算机中无+0和-0区分

理由:
+0的原码,反码,补码,都是00000000 
-0的原码是10000000反码是11111111 ,而补码是00000000

补码解决了0的符号的两个编码的问题:

1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 

                      = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原=0


4)8位,-128的原码是多少?
答:-128没有原码,原码的表示范围为[-127, +127], 
计算机用补码表示,由于去掉了-0, [1000 0000]补 就是-128. 可以表示用来表示最小值-128,补码的表示范围为[-128, 127]

2.为什么左移是逻辑运算,右移是算术运算

左移是逻辑运算,右移是算术运算
逻辑移位是连标志位(正负号)一起操作的,所以可能会改变正负号。
而算术移位是固定好标志位,移动其他的位,不会改变正负号,但前面被移动的位是补0还是补1,如果标志位是1,则都补1,是0,则都补0。

答:如果负数右移补0,一是负数变为了正数,补1的话,由于计算机都是补码表示,由于恰到好处

3.左移等于*2,右移等于/2,对负数也适合吗
答:是适合的,原来理解错误,是由于从原码角度考虑了,没有从补码角度考虑,计算机是用补码进行运算的。输出的进制数也是补码。

本例int是32位,4字节,所以16进制共8位




3 0