some有趣的小零碎

为什么需要反码?

转载自:知乎

反码的作用就相当于数学中的负数。

对于小学生来说,会做的算术题是:5-3,但是不会做3-5。于是,我们上初中的时候,数学里就引进了一个新的概念:负数。引入负数之后,本来是减法的运算就可以变成加法来实现:

3-5=3+[-5]=[-2],中括号代表“负数”,“负数”就是我们人为给出的数学术语。

对于计算机来说,会做的算术题是:5+3,但是不会做3-5。于是,我们就在编码里引进了一个新的概念:反码。引入反码之后,本来是减法的运算就可以变成加法来实现:

3-5=3+[-5]=[-2],中括号代表“反码”,“反码”就是我们人为给出的计算机术语。

这里,你一定有一个疑问:为什么计算机只会做5+3,不会做3-5。这是因为在计算机的数字电路中只有加法器,没有所谓的“减法器”。不是说计算机厂商不会设计减法器,因为聪明的人既然发明了方法能够用加法来实现减法操作,那为什么还需要画蛇添足的弄一个减法器?

为什么需要补码?

都是因为“0”这个特殊数字的存在。

先问你一个问题:0是正数还是负数?你肯定会说:0既不是正数也不是负数,这是我们初中学到的数学知识。这个回答没有问题,所以以后每次碰到0,人们都不会把它当正数或负数。

那么计算机呢?计算机不同于人脑,计算机在碰到任何数字之前只根据最高位的符号位来判断正负性,“0”表示正数,“1”表示负数。

前面我们推论了为何要用反码,那么用8位二进制反码表示的正数范围: +0 —— +127;负数范围: -127 —— -0。但是,其中有两个特殊的编码会出现:

[0_0000000]=+0 (反码)

[1_1111111]=-0 (反码)

其实,+0和-0代表的都是0。这样一来,“0”这个数字在计算机中的编码就不是唯一的了。对于计算机来说,这是绝对不行的,因为任何数字都只能有1个编码

于是,聪明的人就做了这样一个决定:把0当成正数,也即+0,这样0的编码就变成:0_0000000。那8位二进制表示的正数范围仍然是: +0 —— +127。

但是,对于负数就必须要做调整,也即-0必须要让位1_1111111这个编码(反码)不能表示-0, 我们可以把负数整体向后“挪动1位”只要将8位二进制表示的负数范围从:-127 —— -0变成:-128 —— -1,就能成功解决问题。

那么怎么整体挪动1位呢?方法就是反码+1,{1_1111111}编码就不再表示-0,而变成了-1。顺着推,最小的编码{1_0000000}就是-128。

我们给这个反码+1又人为的取了一个新的名字,叫补码。于是乎,补码的定义如下:

所以:

{0_1111111}=+127 (补码)

{0_0000000}=+0 (补码)

{1_1111111}=-1 (补码)

{1_0000000}=-128 (补码)

为什么需要移码?

原因就是机器在比较两个数的大小时,用原码和补码都是不方便的,因为在这两种表示中负数都比正数大(数值上)。所以有人发明了移码,它的特点就是比较真值不变。
那么如何设计移码呢?要真值和机器值正比,很简单,平移就ok。那平移多少呢?先看三个位能表示的真值:
111 、110、101、100、011、010、001、000
我们在这些数中找到中间值作为0,如100。可以类推为 2^(n-1),或首位为1其他位为0的机器数 作为数字0.
111 => 3
110 => 2
101 => 1
100 => 0
011 => -1
010 => -2
001 => -3
000 => -4
那么n位定点整数,可知:x移 = x+2^(n-1) (-2^(n-1) <= x < 2^(n-1))。

计算机内部是怎样存储数据的

整数在计算机中以原码的形式存储
负数在计算机内部以补码的形式存储
归根到底,我们可以说计算机是用补码进行存储的。为什么?因为原码=对应相反数的补码,实际上也是补码,只不过是负数的补码。
计算机的基本存储单位:Byte

为什么计算机用补码来存储数据?

因为在计算机中,CPU在计算数据时只支持加法计算

5-4 <=> 5 + (-4)

使用原码直接相加无法求得正确数值。

因此为了方便计算,计算机中的加法计算是使用补码加法来实现。

例:5 + (-4)

00000000 00000000 00000000 00000101

  • 11111111 11111111 11111111 11111100

———————————————————————————

1 00000000 00000000 00000000 00000001 (溢出位舍去,得到+1)

因此可见,补码的设计更加便于计算。

一些基本数据类型所占位数

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值