首页 > 代码库 > 关于原码,反码,补码和左右移位的若干思考
关于原码,反码,补码和左右移位的若干思考
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的原码是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位
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。