负数和小数点在计算机中的二进制表示

一、负数的表示:

在计算机中,负数以其正值的补码形式表示,补码为该数的反码加一。以下是补码的概念。

1.源码

  一个整数,按照绝对值大小转换成的二进制数,称为原码

在4字节中,0110 是 6 的原码。

2.反码

  将二进制数按位取反,所得的新二进制数称为原二进制数的反码

0110 的反码是 1001

3.补码

  二进制的反码加1,得到该二进制数的补码,1010则为6在二进制中的补码

1001 的补码是 1010

4.负数运算

  在二进制中计算5-3,减号表示为加该二进制数的补码

 

5.补码为何是反码+1

  • 计算机的补码也相当于算术里的补数

  要了解补数,首先该了解的概念。是指一个计量系统的计数范围,如时钟等,它的计量范围是0~11,模 = 12。计算机也是有一个计量范围,即都存在一个“模”,32位计算机的计量范围是2^32,模 = 2^32。“模”是计量器产生“溢出”的量,它的值在计量器上表示不出来,在12小时的时钟里,12点就是0点。

 

  • 补数二者相加等于模的数为补数

  在以模为12的系统中,加9和减3效果是一样的,因此凡是减3运算,都可以用加9来代替。对“模”12而言,9和3互为补数(二者相加等于模)。

  所以我们可以得出一个结论,即在有模的计量系统中,减一个数等于加上它的补数,从而实现将减法运算转化为加法运算的目的。

# 按以上理论,减一个数等于加上它的补数,所以
 5 - 3
 # 在4位字节,模=16
 5 + (16 - 3)   //模减去3则为3的补数
 # 用二进制表示则为:
 0101 + (10000 - 0011)
 # 等价于
 0101 + ((1 + 1111) - 0011)
 # 等价于
 0101 + (1 + (1111 - 0011))
 # 等价于
 0101 + (1 + 1100) // 括号内是3(0011)的反码+1,正是补码的定义
 # 等价于
 0101 + 1101
 # 所以从这里可以得到
 -3 = 1101
 # 即 `-3` 在计算机中的二进制表示为 `1101`,正是“ -3 的正值 3(`0011`)的补码(`1101`)”。
 # 最后一步 0101 + 1101 等于10010
 #在4位字节中为0010

 

 二、小数点的表示:

1.浮点数表示

  • IEEE754 标准

  计算机是无法识别 . 号的,那么二进制小数中的点需要被保存下来,它是如何保存的呢?

1985年,随着IEEE标准754的推出,制定出了浮点数的统一表示以及运算的标准

  目前,所有的计算机都支持这个标准,为科学应用程序在不同机器上的可移植性鉴定了基础

  • 标准公式

   V = (-1)s * M * 2E     V=(-1)sign * mantissa * base * exponent 

  s:符号  s取1时代表负,取0代表正

  m:尾数  小数点后面的数,1< m < base,在二进制中,m永远 1 < m <2

  e:指数   以10为底的指数

  base:进制数/基数,在计算机中一般为2

  • 转换例子

  例如16.125

  十进制转换为二进制,整数位与小数位分开转换,16转为10000

  0.125采用新的转换二进制方法,如下:

将小数位不断乘2,每次取其整数部位数的0或1,直到小数位变成0
0.125 * 2 =0.25  ———>  0
0.250 * 2 =0.50  ———>  0
0.500 * 2 =1.00  ———>  1

  得出0.125二进制表示为001,因此16.125二进制表示为10000.001

  使用IEEE754标准表示为 16.125=1.0000001*24

  1.0000001为尾数,2为基数,4为指数

 

2.浮点数存储

  • 单精度浮点数

  以float类型为例,它是单精度存储类型,占4个字节,一个字节有8位,因为它占32位内存空间

  

 

   将16.125=10000.001=1.0000001*24的二进制存储到float中,s为0,E为4,M为1.0000001

  值得注意的是,指数E有一个偏移值为127,正数则是加,负数则减;尾数M因在二进制中始终 1< M <2,所以M的第一位数永远为1,需在计算机中省略掉

  指数127+4=131转为二进制10000011,尾数为0000001,需补齐23位,填入内存中为:

  

  单精度类型float的取值范围是-3.4e38~3.4e38,有效数字为7,由于最高位不为1,可能是8

  • 双精度浮点数

  以double类型为例,它是双精度存储类型,占8个字节,拥有64位内存

  

 

  其存储方式与单精度相同,只是存储的大小和精度有所改变

  双精度类型float的取值范围是-1.7e308~1.7e208,有效数字为15~16

 

3.定点数与浮点数区分

  计算机中常用的数据表示格式有两种,一是定点格式,二是浮点格式,浮点格式应用较多

  • 定义

  定点数浮点数,是指在计算机中一个数的小数点的位置是固定的还是浮动的

  • 区分

  1.如果一个数中小数点的位置是固定的,则为定点数;如果一个数中小数点的位置是浮动的,则为浮点数

  2.定点格式可表示的数值的范围有限,但要求的处理硬件比较简单。而浮点格式可表示的数值的范围很大,但要求的处理硬件比较复杂

  3.采用定点数表示法的计算机称为定点计算机,采用浮点数表示法的计算机称为浮点计算机。定点机在使用上不够方便,但其构造简单造价低,一般微型机和单片机大多采用定点数的表示方法。浮点机可表示的数的范围比定点机大得多,使用也比较方便,但是比定点机复杂,造价高,在相同的条件下浮点运算比定点运算速度慢

  • 表示法

  通常将定点数据表示成纯小数或纯整数。为了将数表示成纯小数,通常把小数点固定在数值部分的最高位之前;而为了把数表示成纯整数,则把小数点固定在数值部分的最后面

 

 三、总结

1.负数在计算机中以补码形式存储,补码类似算术里的补数,二进制中补码为反码+1

2.小数点在计算机中以浮点形式存储,采用国际通用IEEE754标准,公式为V = (-1)s * M * 2E

3.除了浮点数还需要了解有定点数,顾名思义,小数点位置固定。

 

参考原文:https://blog.csdn.net/leonliu06/article/details/78685248

     https://blog.csdn.net/baidu_35812312/article/details/79203971
      

posted @ 2020-11-19 11:41  小康kavin  阅读(4416)  评论(0编辑  收藏  举报