计算机中数的表示和运算
创始人
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” 中断.

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

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...