![a0c7624cc7cf8b45a562036e899c99ac.png](https://img-blog.csdnimg.cn/img_convert/a0c7624cc7cf8b45a562036e899c99ac.png)
在学习之前,我们先来看一段代码的计算。为什么会出现这样的结果呢?
std
在计算机中最主要的数据类型有无符号整型、有符号整型、浮点数、布尔值
- 布尔值
就是真/假,1或者0。在计算机中用最小的1个字节表示,即8位。
- 无符号整型
即我们数学中的正整数,在计算机中使用二进制的原码表示无符号整数,没有正负号占位。在32位电脑中,最大数为2^32-1,最小值为0。
- 带符号整型
带符号的整型,用最高位表示正负号。0表示正号,1表示负号。所以,在32位电脑中,最大值为2^31-1,最小值为-2^31。在计算机中,带符号整型的整数部分用补码表示。正数的补码还是自己,负数的补码是符号不变,其余各位取反,末尾加1。即[-1]=[100000001]原=[11111111]补
那么问题来了为什么不用原码表示?不是更直观?更让人理解吗?首先,我们人脑知道第一位是符号位,我们可以根据正负号来进行加减法。但是,对于计算机而已,加减法已经是最基础了,要设计的尽量简单。如果计算机辨别“符号位”显然让计算机的基础电路设计的变得十分复杂!于是人们想出将符号位也参与运算的方法。即1-1=1+(-1)。下面开始探索将符号位参与运算。有关原码、反码、补码的计算方式见如下:
Chdy:开篇——内容概要zhuanlan.zhihu.com![81740713460fbeb77c390e45971f1bc7.png](https://img-blog.csdnimg.cn/img_convert/81740713460fbeb77c390e45971f1bc7.png)
原码:1+(-1)=[00000001]原+[10000001]原=[10000010]原=-2
反码:1+(-1)=[00000001]反+[11111110]反=[11111111]反=[10000000]原=-0
补码:1+(-1)=[00000001]补+[11111111]补=[00000000]补=[00000000]原=0
显然,原码的计算结果是错误的。而反码和补码是正确的。而反码问题就出现在“0”的表示上,+0=[00000000]反,-0=[11111111]反。显然正负0用反码表示是不等的。于是,带符号的整数就用补码来表示。
说完了,有符号、无符号整型在计算机中的表示方式!我们就可以解答前面提到过的问题。 首先计算机在判断两个数的大小,先判断两个数的类型,两个值为有符号类型,则用有符号表示。如果一个值为无符号整型,另一个值为有符号整型,计算机就会使用无符号整型来比较。-1<0,在计算机中的结果为真,是因为将这两个值都当作是有符号整型来处理了,则[-1]=[111111111]补,[0]=[00000000]补,使用有符号整型处理,负数自然要比0小,所以结果为真。而-1<0U在计算机中的结果为假,是因为[-1]=[111111111]补,[0]=[00000000]原,计算机把他们当成了无符号的整型来比较了([11111111]=2^7),所以结果就出现了-1<0U为假。
- 浮点数
![f23bbe81dac5b7ddebcecdf75607389c.png](https://img-blog.csdnimg.cn/img_convert/f23bbe81dac5b7ddebcecdf75607389c.png)
插入图片更加直观。其实,浮点数就是用我们的科学计数法来在计算机中表示。但是,里面也包含了一些规范。此处我们拿32位计算方式来举例,64位类推。
- 第一位表示正负号,0表示正号,1表示符号;
- 用8位表示科学计数法的指数,计算机内值需要减去127,才等于真值。反之真值加上127,等于计算机内值大家考虑一下,为什么要减去127呢?大家可以思考一下!
- 剩余的23位用于表示小数部分;
- 整数部分1,不在计算机中表示。转化为真值,需要加1。
-2.32在计算机中的表示为:
转化:将整数部分用二进制表示2=[10]原,小数部分0.32=[0.010100011110...]
规格化:使用科学计算法可表示为-1*1.0010100011110...*2^1
填充:用计算机內值表示为s为1,Exponent为1+127,Significand为尾数0010100011110...
内存中的表示为1 10000000 0010100011110...
尾数部位是一个无限循环小数,看到这里我们就明白了,为什么在编译器中浮点数精确度不准确的原因了把!下面提供一个网站,可以用来将真值转化为计算机內值。
IEEE-754 Floating Point Converterwww.h-schmidt.net在结尾的时候,我们来思考一下!为什么指数的介要加一个偏置常数(127,即2^(8-1)-1)呢?试想一下,如果我们不加这个偏置常数,指数的介是负数要怎么表示?所以,这里面加上一个偏制常数,是为了表示负数的?一些好奇的同学又会问,为什么不跟带符号整型一样使用补码的方式来表示呢?上文中,不是提到很多补码的好处么?带着这个问题,我们进行下一个课题的学习——逻辑门电路。计算机是怎么实现加、减、乘、除的?