原码,反码和补码的一些小问题

为什么补码等于反码加一?为什么补码中有符号位,只能表示最大正数补码+127,却能表示最大正数-128呢?计算机中怎么对待符号位的?

一、原码

1.定义(百度):

原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。

2.数学定义:

在这里插入图片描述
其中,负数时,2^(n-1)相当于负号。其二进制为:1000 0000(B)

理解: 为了表达负数,引入原码。如何表达负数?将n位二进制中最高位人为记为符号位。
故,8位二进制中,范围为 -127 ~ 127;
1111 1111(原)= -127;
0111 1111 (原)= +127;

3.原码的优势:简单直观。

可以直接知正负和转化为十进制数。

4.原码的缺点:

1.有两个0;
一个+0 即 0000 0000(原);
一个-0 即 1000 0000(原)。
2.无法实现减法(异号数相加)计算。
例如:-1 + 1 = 0
1000 0001 (原) + 0000 0001(原)= 1000 0010(原)= -2

5.注意点:计算机中不存在原码。

可以说是人们为了表达正负数,引入了原码概念。

二、反码

1.定义(百度):

反码是数值存储的一种,多应用于系统环境设置,如linux平台的目录和文件的默认权限的设置umask,就是使用反码原理。
没学到,不太懂。
不过反码是相对于原码存在的,且帮助得到补码。
简单定义: 反码跟原码是正数时,一样;
负数时,反码就是原码符号位除外,其他位按位取反。
如:1001 0010(原)= - 18 的反码是 1110 1101(反)= 109

按位取反也可以看成,绝对值最大数 - 原码绝对值
即 (1)111 1111 - (1)001 0010 = (1)110 1101 (符号不变)

2.数学定义:

在这里插入图片描述

3.意义:

1.反码通常是用来由原码求补码或者由补码求原码的过渡码。
换个角度,似乎如果没有反码,不影响原码和补码互转化啊。

2.为了解决“正负相加等于0”的问题,在“原码”的基础上,人们发明了“反码”
“反码”表示方式是用来处理负数的,符号位置不变,其余位置相反。
例如:-1 + 1 = 0
1000 0001 (原) + 0000 0001(原)= 1000 0010(原)= -2
1111 1110(反) + 0000 0001(反) = 1111 1111(反)= 1000 0000(原)= -0
这不就实现了减法?

再来一例:-14 + 12 = -2
1000 1110 (原) + 0000 1100(原)
1111 0001 (反)+ 0000 1100(反) = 1111 1101(反) = 1000 0010(原)= -2

真的?14 - 12 = 2
0000 1110 (原 ) + 1000 1100(原)
0000 1110(反)+ 1111 0011(反)= 0000 0001(反) = 0000 0001(原) = 1
其实在这时存在着一个溢除单位,第一位为0,第二次为1,所以结果反码也许应该加上进位。这样可以解决反码运算问题。但是不够适用,仍然有进位

4. 注意点:1.计算机中无反码。

2.而且,反码中仍然存在着-0 = 1000 0000 (原)其反码 1111 1111(反)

三、补码

1.“模”概念(不准确)和补数

“模”是指一个计量系统的计数范围,如过去计量粮食用的斗、时钟等。计算机也可以看成一个计量机器,因为计算机的字长是定长的,即存储和处理的位数是有限的,因此它也有一个计量范围,即都存在一个“模”。
生活中处处有模的存在,例如钟表计时,假设现在时针指向数字8,如要把时针调到指向5,(顺时针为正)则可以:

1 将时针逆时针拨动3格。
2.将时针顺时针拨动(8+12 - 3)格。
两者的结果是一样的。这里称12为“模”,而称+9是(-3)以12为模的补数,
故有 8 -3= 8+ (12 -3) ,这里可以看到将减法转换成加法的过程,即“加上模减去绝对值的差”。
注意补数定义:
负数的补数:模减去该负数的绝对值,
正数的补数:是本身。0的补数是0

同理,还有度数的360等等。
所以在计算机中,原数叫原码,那么补数就叫补码

2.补码(百度):

在计算机系统中,数值一律用补码来表示和存储。 原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理

3.数学定义:

在这里插入图片描述

4.补码真正的由来

想必大家都明白,对原码按位取反(除符号位),然后加1的原则。
想过为什么加1吗?
根据上述补数的介绍,8位进制(有一位做了符号位,本质只有 -127 ~ 127),
模是1 0000 0000
例:-10 的 1000 1010(原) 1111 0101(反) 1111 0110(补)
同时 模 - 原码(绝对值) = 补码
1 0000 0000(模) - 0000 1010 (原绝对值)= 1111 0110 (补)
具体步骤如下:

1 0000 0000(模) = (1111 1111  + 0000 0001) - 0000 1010(原绝对值)
=(1111 1111 - 0000 1010 ) +  0000 0001
= 1111 0101(反)+ 0000 0001  (反码 + 1 )
= 1111 0110(补)  

那么 模 - 原码(绝对值) = 反码 + 1 = 补码

原码是正数,补码是本身,0的补码是0 。
如此以来巧妙使符号不影响结果,又能实现区别正负。但这时反码似乎没什么作用。只要找到模,理解模 - 原码(绝对值) = 补码,就可以较快速得到原码和补码的转换,似乎可以丢了反码。

注意: 如果用按位取反,加一原则,你是无法得到 -128 这个原码的。
因为 -128 补码是 1000 0000,如果减一(0000 00001)= 0111 1111(反)
按位取反 0000 0000(原),这不是0吗?

但是,这样,原码(1000 0000),模(1 0000 0000)- 原码 = 1000 0000 (补码)
原码(1000 0000)是-0,这个历史遗留。但是记住,计算机存储中无原码。准确来说是没有符号位, 那么这个原码可以理解为
-128是一个负数,所以它的补码是它的“模”减去它的绝对值,即:
1 0000 0000 - 1000 0000 = 1000 0000(补)。

还有这种理解
在这里插入图片描述

5.注意点:1.计算机中仅有补码表示与存储。

2。模的确定。计算机中由于多一个符号的理解。所以,
4 位二进制数的模是 2^4=16,
8 位二进制数的模是 2^8=256,
16 位二进制数的模是 2^16=65536,
32 位二进制数的模是 2^32。

四、计算机中对数的存储于处理

1.一个标准:计算机仅有0,1存储。

简单来说就是无符号数字。

2.两个指令:

如果是 unsigned char ,计算机的一个指令认为最高位,不代表符号。
如果是char, 计算机的另一个指令认为最高位是符号位,0为正,1为负。

3.数据存储只有补码,

因为补码和无符号数运算统一,
不存在原码,反码存储。

优秀指导文章:原码、反码、补码的产生、应用以及优缺点有哪些?

笔者水平有限,目前只能描述以上问题,如果有其他情况,可以留言,有错误,请指教,有继续优化的,请分享,谢谢!

2020年02.12 家

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值