补码原码反码溢出问题
数据的机器层次表示
文章目录
- 数据的机器层次表示
- 2.1 补码+原码+反码
- 1. 原码表示法
- 2. 补码表示法
- 3. 反码表示法
- 4. 三种表示法比较
- 2.2 原码补码加减法运算
- 1. 补码加法
- 2. 补码减法
- 3. 符号扩展
- 2.3 溢出判断
- 1. 采用一个符号位
- 2. 采用进位位
- 3. 采用变形补码(双符号位)
2.1 补码+原码+反码
1. 原码表示法
符号位单拎出来,正数为0,负数为1。
假设机器字长5位:
1)整数:
+1101,[x]原[x]_原[x]原=0,1101
-1101,[x]原[x]_原[x]原=1,1101
2)小数
+0.001,[x]原[x]_原[x]原 =0.0010
-0.001,[x]原[x]_原[x]原 =1.0010
3)真值0表示
[+0]原_原原 =0,0000
[-0]原_原原 1,0000
2. 补码表示法
1)方法一
小数:X=0.0110,[x]补[x]_补[x]补 =0.0110
X=-0.0110,[x]补[x]_补[x]补 =1.1010(数值部分:.0110 →\rightarrow→ .1001 →\rightarrow→ .1010)
整数:X=1101,[x]补[x]_补[x]补 =0,1101
X=-1101,[x]补[x]_补[x]补 =1,0011(数值部分:1101 →\rightarrow→ 0010 →\rightarrow→ 0011)
2)方法二(较简单)
当X为负数时:从低位至高位,尾数的第一个1及右部的0保持不变,左部的各位取反,符号位保持不变
X=-0.1110011000
[X]原_原原 = 1.1110011000
[X]补_补补 = 1.0001101000
3)真值0表示
[+0] 补_补补=[-0] 补_补补 =0,0000
表示范围变化:由于补码±0相同,所以补码多一个负数值为最小负数
3. 反码表示法
1)定义:正数,数值部分与真值形式相同;对于负数,将真值的数值部分按位取反。
小数:X=0.0110,[X]反_反反 =0.0110
X=1.0110,[X]反_反反 =1.1001
整数:X=1101,[X]反_反反 =0,1101
X=-1101,[X]反_反反 =1,0010
2)真值0表示
[+0] 反_反反 =0,0000
[-0] 反_反反 =1,1111
4. 三种表示法比较
1)对于整数,都等于真值本身。
2)最高位都表示符号位。
3)对于真值0,补码只有唯一一种表示形式
4)补码多表示的负数:①整数:−2n-2^n−2n ②小数:−1-1−1
2.2 原码补码加减法运算
1. 补码加法
计算 X+YX+YX+Y :
X+Y←[X+Y]补←[X]补+[Y]补X+Y \leftarrow [X+Y]_补\leftarrow [X]_{补}+[Y]_{补}X+Y←[X+Y]补←[X]补+[Y]补
注意:如果Y<0Y<0Y<0,那么这里的 [Y]补[Y]_{补}[Y]补 就是负数的补码,但是跟变补没关系(对X同理)
A=0.1011, B=-0.1110,求A+B
[A]补[A]_{补}[A]补 =0.1011,[B]原[B]_{原}[B]原= 1.1110,[B]补[B]_{补}[B]补= 1.0010
[A]补[A]_{补}[A]补+[B]补[B]_{补}[B]补= [A+B]补[A+B]_{补}[A+B]补= 1.1101
[A+B]原[A+B]_{原}[A+B]原= 1.0011
A+BA+BA+B= -0.0010
2. 补码减法
计算 X−YX-YX−Y :
X+Y←[X−Y]补←[X]补+[−Y]补X+Y \leftarrow [X-Y]_补\leftarrow [X]_{补}+[-Y]_{补}X+Y←[X−Y]补←[X]补+[−Y]补
根据 [Y]补[Y]_{补}[Y]补 求 [−Y]补[-Y]_{补}[−Y]补 :
①求 [Y]补[Y]_{补}[Y]补
② [−Y]补[-Y]_{补}[−Y]补= [[Y]补]变补[[Y]_{补}]_{变补}[[Y]补]变补:将 [Y]补[Y]_{补}[Y]补 连同符号位一起求反,末尾加1
例如:
[Y]原[Y]_{原}[Y]原 = 1.0110
[Y]补[Y]_{补}[Y]补 = 1.1010
[−Y]补[-Y]_{补}[−Y]补 =1.1010 →\rightarrow→ 0.0101 →\rightarrow→ 0.0110
例题:
A=0.1011, B=-0.0010,求A-B
[A]补[A]_{补}[A]补 =0.1011,[B]原[B]_{原}[B]原= 1.0010,[B]补[B]_{补}[B]补= 1.1110,[−B]补[-B]_{补}[−B]补= 0.0010
[A]补[A]_{补}[A]补+[−B]补[-B]_{补}[−B]补= [A−B]补[A-B]_{补}[A−B]补= 0.1101
[A−B]原[A-B]_{原}[A−B]原= 0.1101
A−BA-BA−B= 0.1101
3. 符号扩展
场景:某程序需要将8位数与另外一个16位数相加,需要将8位数转化成16位数
例如:00001101/10001101扩展成16位(8位中,包括1位符号位)
1)原码符号扩展
- 正数:0000000000001101
- 负数:0000000010001101
2)补码符号扩展
- 正数:0000000000001101
- 负数:1111111111110011
2.3 溢出判断
假设被操作数为: [X]补=Xs,X1X2X3...Xn[X]_补=X_s,X_1X_2X_3...X_n[X]补=Xs,X1X2X3...Xn
操作数为: [Y]补=Ys,Y1Y2Y3...Yn[Y]_补=Y_s,Y_1Y_2Y_3...Y_n[Y]补=Ys,Y1Y2Y3...Yn
其和(差):[S]补=Ss,S2S1S3...Sn[S]_补=S_s,S_2S_1S_3...S_n[S]补=Ss,S2S1S3...Sn
1. 采用一个符号位
1)正溢: Xs=Ys=0,Ss=1X_s=Y_s=0,S_s=1Xs=Ys=0,Ss=1(两个正数加起来变成了负数)
设 X=1011B=11D,Y=111B=7DX=1011B=11D, Y=111B=7DX=1011B=11D,Y=111B=7D
[X]补=0,1011,[Y]补=0,0111[X]_补=\textcolor{red}0,1011,[Y]_补=\textcolor{red}0,0111[X]补=0,1011,[Y]补=0,0111
[X+Y]补=1,0010[X+Y]_补=\textcolor{red}1,0010[X+Y]补=1,0010
X+Y=−14DX+Y=-14DX+Y=−14D
2)负溢: Xs=Ys=1,Ss=0X_s=Y_s=1,S_s=0Xs=Ys=1,Ss=0 (两个负数加起来变成了正数)
设 X=−1011B=−11D,Y=−111B=−7DX=-1011B=-11D, Y=-111B=-7DX=−1011B=−11D,Y=−111B=−7D
[X]补=1,0101,[Y]补=1,1001[X]_补=\textcolor{red}1,0101,[Y]_补=\textcolor{red}1,1001[X]补=1,0101,[Y]补=1,1001
[X+Y]补=0,1110[X+Y]_补=\textcolor{red}0,1110[X+Y]补=0,1110
X+Y=14DX+Y=14DX+Y=14D
2. 采用进位位
Cs,C1C2..CnC_s,C_1C_2..C_nCs,C1C2..Cn
CsC_sCs :符号位产生的进位
C1C_1C1 :最高数值位产生的进位
产生溢出的条件:Cs⨁C1C_s\bigoplus C_1Cs⨁C1 (最高数值位产生的进位和符号位产生的进位不同)
1)正溢:C1=1,Cs=0C_1=1,C_s=0C1=1,Cs=0
2)负溢:C1=0,Cs=1C_1=0,C_s=1C1=0,Cs=1
3. 采用变形补码(双符号位)
1)思想:将符号位扩充为两位,Ss1(真符:代表该数真正的符号),Ss2S_{s1}(真符:代表该数真正的符号),S_{s2}Ss1(真符:代表该数真正的符号),Ss2
2)产生溢出的条件:Ss1⨁Ss2S_{s1}\bigoplus S_{s2}Ss1⨁Ss2
① Ss1Ss2=00S_{s1}S_{s2}=00Ss1Ss2=00 ,结果为正数,无溢出
② Ss1Ss2=01S_{s1}S_{s2}=01Ss1Ss2=01 ,结果正溢
③ Ss1Ss2=10S_{s1}S_{s2}=10Ss1Ss2=10 ,结果负溢
④ Ss1Ss2=11S_{s1}S_{s2}=11Ss1Ss2=11 ,结果为负数,无溢出
00,1011+00,0111=01,0010(正溢)
11,1011+11,0111=10,1110(负溢)
补码原码反码溢出问题相关推荐
- 补码原码反码简单理解
补码原码反码简单理解 看到一句I2S的data是以补码形式来表现数据.再次查阅得出以下只管结论: ####1,首先直观举例机器里面是如何存放有符号数的:#### 1在机器里面表示为 0000 0001 ...
- 计算机原理原码反码,计算机原理 计算 —11011011补码( ) 原码( ) 反码( )11001010补码 原码 反码...
-11011011补码( 100100101 ) 原码(111011011 ) 反码(100100100 ) 11001010补码 11001010 原码 11001010 反码 11001010 ( ...
- 补码 原码 反码
假设有一个 int 类型的数,值为5,那么,我们知道它在计算机中表示为: 00000000 00000000 00000000 00000101 5转换成二制是101,不过int类型的数占用4字节(3 ...
- 由Python位运算到原码反码补码
采用书籍Python核心编程(第二版),人民邮电出版社,2008年7月第1版.本书以Python2.5为主,但笔记主要以Python3.6为主. 一.Python位运算操作符 Python支持标准位运 ...
- 原码 反码 补码 之间在小数正数间的转换
原码 反码 补码 之间在小数正数间的转换 基本转换 对于正数 原码等于反码等于补码(小数也一样) 对于负数 原码除了符号位取反即反码 反码基础之上+1即补码 但是在遇到某些题时候还是会混淆,比如三者在 ...
- 关于计算机中 原码, 反码, 补码 详解
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...
- 原码, 反码, 补码, 移码 详解
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...
- 原码 反码 补码 详解
一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放 ...
- python二进制反码例题_python中的进制转换和原码,反码,补码
python中的进制转换和原码,反码,补码 计算机文件大小单位 b = bit 位(比特) B = Byte 字节 1Byte = 8 bit #一个字节等于8位 可以简写成 1B = 8b 1KB ...
最新文章
- 从零开始_学_数据结构(六)——排序(冒泡、插入、希尔、简单选择、归并、快速)...
- Golang 标准库提供的Log(一)
- ESD二极管 DW12P4N3-S 电压12V 封装DFN2020-3L
- 论文浅尝 | Iterative Cross-Lingual Entity Alignment Based on TransC
- 面试阿里,我还是挂在了第四轮……
- 超声乳化设备行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- myeclipse新建JSP中DOCTYPE问题
- c语言gui程序,GUI编程
- 1000人系统服务器配置,win云服务器在线1000人配置
- python abs的功能_Python Pandas DataFrame.abs()用法及代码示例
- PHP之mb_convert_case使用
- 某试卷由26道题c语言,c语言模拟试题
- FINVASIA集团宣布收购ActTrader
- 配置vscode C语言运行环境(保姆级教程)
- elasticsearch-java客户端测试
- php 百度收录api_PHP查询百度收录API接口源码
- Sigrok逻辑分析仪软件(基于CY7C68013A)
- 蜂窝通信模组,是物联网终端的核心组件之一
- 单链表的基本操作,建立单链表,插入删除等
- 数字签名算法---加密学习笔记(五)
热门文章
- Qt 5.14.2 使用 MaintenanceTool.exe 添加组件
- 计算机更改用户后 无法联网,路由器修改密码后电脑无法上网如何解决
- python换行写入文件
- 2.《如何构建敏捷项目管理团队》之追求高绩效(摘要)
- 计算机社团英语宣传,社团宣传 | 计算机爱好者协会闪亮登场!
- Linux操作系统基础 (一)Linux 登录方式及常用快捷键
- 德艺双修才貌双全 史上16位青楼佳人 莘瑶琴喜嫁卖油郎
- php语言头像,使用PHP语言通过邮箱获取全球公认的Gravatar头像地址
- 从今天开始,没有「Office」了!
- 使用left join比直接使用where速度快的原因