简单的计算机原理

简单的计算机原理

20231109

Talk is cheap.

Show me the code.

目录

1.数值的不同表示形式(2/8/10/16进制)
2.各进制之间的转换
3.原码、反码、补码

1.数值的不同表示形式

我们在生活中往往能听到2进制、8进制、10进制、16进制这种讲法,那是什么意思呢?
其实这种讲法只是数值的不同表现形式。
例如13
2进制表示:01101
8进制表示:15
10进制表示:13
16进制表示: d

接下来,我们介绍各个进制

1.1二进制

相信大部分人在生活中对于十进制都比较熟悉,我们接触到的数字几乎大部分都是以十进制进行表示的,那么对于人来说,接触的是十进制,让人不禁思考,计算机接触的也是十进制吗?
实则不然,计算机内部数据处理使用的是二进制

满2进1(类比十进制)
数字只由0-1构成

题外话: !看过《孤注一掷》的朋友们,潘安(张艺兴)在里面疯狂比6,最后数学老师进行分析发现他提醒他报警,两人之间的交流就是通过二进制,6的二进制是110,潘安很聪明的把信息传递给了他的好朋友。!

1.2 八进制

类比二进制和十进制,八进制就是

满8进1
数字只由0-7构成

1.3 十六进制

类比前面几个进制

满16进1
数字只由0-15构成

注意!!!这里大家肯定会好奇,要是数字是一个两位数,一个位置上怎么放一个两位数呢???
发明16进制的人很聪明,他说:既然数字不行,我就换一种表示方法,我用字母!

于是,十六进制中引入了字母代替两位数
具体的对应关系如下:

请添加图片描述
a-f分别对应了10-15五个数。
例: 0x3f 这就是一个16进制数

2.各进制之间的转换

那么,有这么多种进制,潘安和数学老师之间是怎么实现进制转换的呢?

2.1各进制转十进制

由于各进制在转化为十进制时具有相同规律,所以我们先将各进制转化为十进制的过程。

以二进制为例:
110----->对应的是6
111----->对应的是7
你能否看出规律?
最后一位上加1,数值加1

101—>5
111---->7
第二位加1,数值加2

1000—> 8
1100—>12
第三位加1,数值加4

根据上述例子,你是否发现不同位次上增加1,带来的十进制数的增量不同!而且增量都是2的次幂,因此,我们可以总结出:
在二进制的每个位次上,都对应的一定的权重,他们转换为十进制的数值,就等于 权重x数值
权重就是从2的0次幂一直向上到2的n次幂。

请添加图片描述
如上图:
十进制数值=1x1+1x2+1x4+1x8 =15

现在,你已经学会了如何2转10
同理8转10和16转10也是相同的做法:

8转10

请添加图片描述

16转10

请添加图片描述

2.2 十进制转二进制

接下来介绍十进制转二进制的方法
在这里插入图片描述
对于一个十进制数来说,它是由2的各个次幂相加起来得到的数,那么我们只需要每次整除2,余数就是二进制位上的数字,然后把整除后的数再次操作,最后将得到的数字从右向左放置,就是对应的二进制数

如上图:每次对十进制数进行整除,只会得到0或1,也就是将十进制转化成了二进制。

2.3二进制转八进制

8进制的每一位数字是0-7,如果要用二进制讲0-7的数表示出来,我们会发现,至多需要三位二进制数即可。因此,我们可以得出,如果将一个八进制数看作三个二进制位,那么对应的,我们也就能把二进制进行三个三个的划分,继而转化为八进制表示。
在这里插入图片描述
011–>对应的二进制就是3
101–>对应的二进制就是5

一般来说,将二进制位从右向左进行划分。
注意:开头为 0 的数一般会被当做是八进制数。
同时,当我们想打印一个八进制数时,占位符是 %o

a=107printf("%o",a);  //结果是153
printf("%#o");  //结果是0153

这里需要提醒的是,如果要想打印出标准格式的八进制数,需要在百分号后面加一个井号!

!!!如果不足三位,则直接转换,例如上图的01,就直接转化位八进制中的1。

2.4 二进制转十六进制

根据前面的介绍,我们知道了十六进制由0-9加上 a-f 进行表示,那么根据计算,最多只需要4个二进制位就可以表示一个16进制数。

在这里插入图片描述
和转8进制其实很类似,只不过16进制需要四位转换,相信大家都能够明白,就不过多赘述。

3.原码,反码,补码

整数的2进制表⽰⽅法有三种,即原码、反码和补码
三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表⽰“负”,⽽数值位
例如:

0000000000001 符号位为0 所以是正数
1000000000000 符号位为1 所以是负数

最⾼位的⼀位是被当做符号位,剩余的都是数值位。

特别地:
正整数的原、反、补码都相同。
负整数的三种表示方法各不相同。

原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。

下面重点讲一下负整数的三种表示方法:
1001 这是一个负数的原码
原码:【1001】
反码是符号位不变,其他位次按位取反
反码【1110】
补码是反码加一
补码:【1111】

整型数据中===内存中都是以补码的形式进行存放的

那么有人就会好奇,为什么要用补码存放呢?
实际上,计算机中用补码存储,原因在于使用补码可以将符号位和数值域统一处理;
同时。加减法也可以统一处理(CPU只有加法器)此外,补码和原码的转换,运算过程是相同的,不需要额外的硬件电路。

在这里插入图片描述
例如
原码 1001
原码取反 1110
原码加一 1111
得到:补码 1111
补码取反 1000
补码加一 1001
得到:原码 1001
我们发现进行两次一样的运算又得到了原码,因此可以得到图示结论。原码与补码的运算过程相同

备注:上述讨论均针对有符号整型讨论,对于无符号整型,直接当作正数理解就可以了!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值