计算机中数的表示和运算
创始人
2024-03-16 07:28:50
0

定点数

  • 编程时需要确定小数点位置
  • 难以表示两个大小相差较大的数
  • 存储空间利用率低

在这里插入图片描述
这种用二进制来表示十进制的编码方式,叫作BCD 编码(Binary-Coded Decimal)。

浮点数

  • 小数点的位置可以左右移动的数

在这里插入图片描述
规格化浮点数:

  • IEEE 754规格化的尾数形式为:1.x…x。

浮点数的不精确性:

>>> 0.3 + 0.6
0.8999999999999999

浮点数的加法和精度损失:
在这里插入图片描述

其中指数位较小的数,需要将有效位进行右移(小数点不动,数右移),在右移的过程中,最右侧的有效位就可能被丢弃掉。这会导致对应的指数位较小的数,在加法发生之前,就丢失精度。两个相加数的指数位差的越大,位移的位数越大,可能丢失的精度也就越大。


无符号数

加法运算:

  • 1+1 = 0(有进位)

减法运算:

  • 0-1 = 1(有借位)

乘法运算:

  • 每乘以2,相对于被乘数向左移动一位,最右边补0
  • 乘法实际上是移位和加法的运算。

除法运算:

  • 每除以2,相当于被乘数向右移动1位,最左边补0
  • 除法实际上是移位和减法的运算。

有符号数

  • 用最高位表示符号,其余是数值
  • 最高位是0:表示正数;最高位是1:表示负数

符号数的表示方法:
原码:最高位为符号位,其余为真值部分。符号位+【绝对值】

  • 优点:真值和其原码之间的对应关系简单,容易理解。
  • 缺点:计算机中用原码进行加减运算比较困难;0的表示不唯一。

0的原码表示不唯一:

  • +0 = 0000 0000
  • -0 = 1000 0000

反码:正数的反码与原码相同,负数的反码则是在原码的基础上符号位不变,数值部分按位取反。

X = -52 = -011 0100
[X]原 = 10110100
[X]反 = 11001011

0的反码也不是唯一的:

[+0]反 = [+0]原 = 0000 0000
[-0]原 = 1000 0000
[-0]反 = 1111
1111

补码:若 X > 0,则[X]补 = [X]反 = [X]原;若X < 0,则[X]补 = [X]反+1。

X = -52 = -011 0100
[X]原 = 10110100
[X]反 = 11001011
[X]补 = [X]反 + 1 = 1100 1100
[X]原 也等于 [[X]补]补


0的补码:

[+0]补 = [+0]原 = 0000 0000
[-0]补 = [-0]反+1 = 1111 1111 + 1 = 10000 0000
对于8位有效字长,进位 (第9位) 被舍掉,我们看到的就是8个0,这样一来,就和+0的补码一样了。


所以,补码解决了 0 的表示不唯一的问题。
在这里插入图片描述

除此之外,补码也实现了将减法运算转换为加法运算。

注:我们在实际编程时,负数可用“-”表示。由编译系统将其转换为补码。
例如:-3 编译后的值为 FDH,1111 1101B就是-3的补码。

补码的算术运算:

  • [X + Y]补 = [X]补 + [Y]补
  • [X - Y]补 = [X + (-Y)]补 = [X]补 + [-Y]补

特殊数1000 0000

对于无符号数:

  • 1000 0000 B = 128

在原码中的定义为:

  • 1000 0000 B = -0

在反码中的定义为:

  • 1000 0000 B = -127

在补码中的定义为:

  • 1000 0000 B = -128

计算机能够表示的数是有限的,例如你的计算机是64位,一次最多只能处理64位长的数据。当运算结果超出了计算机所能表示的范围的时候(例如64位机),就会产生溢出。


无符号数的表示范围

无符号数的表示范围:

  • 0 <= X <= 2n-1,n表示字长

无符号数加减运算溢出的判断方法:

  • 当最高位向更高位有进位(或借位)时产生溢出。
  • 例如,对于8位机来讲,8个1再加一,溢出位超出了有效字长,在有效字长范围内,结果为0(出错)。最高的进位1会放在一个特殊的位置。

有符号数的表示范围

注:n表示字长
原码和反码:

  • -(2n-1-1) <= X <= 2n-1-1

补码:

  • 2n-1<= X <= 2n-1-1

对于8位2进制数:

  • 原码:-127 ~ +127
  • 反码:-127 ~ +127
  • 补码:-128 ~ +127

有符号数加减运算溢出的判断方法:

因为无符号数和有符号数的表示范围不一样,所以判断是否溢出的方法也不一样。
对于有符号数, 判断是否溢出,要用双位。

  • 最高位进位状态 异或 次高位进位状态 = 1, 则结果溢出。
  • 异或: 相同为0, 相异为1。

乘法运算不存在溢出问题, 而除法运算溢出时, 会产生 “除数为0” 中断.

注: 计算机中的符号数默认以补码形式表示。
只有原码的数值部分是真值。
反码和补码的数值部分都不是真值。

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...