数据的机器层次表示

文章目录

  • 数据的机器层次表示
    • 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​,X1​X2​X3​...Xn​

操作数为: [Y]补=Ys,Y1Y2Y3...Yn[Y]_补=Y_s,Y_1Y_2Y_3...Y_n[Y]补​=Ys​,Y1​Y2​Y3​...Yn​

其和(差):[S]补=Ss,S2S1S3...Sn[S]_补=S_s,S_2S_1S_3...S_n[S]补​=Ss​,S2​S1​S3​...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​,C1​C2​..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}=00Ss1​Ss2​=00 ,结果为正数,无溢出

​ ② Ss1Ss2=01S_{s1}S_{s2}=01Ss1​Ss2​=01 ,结果正溢

​ ③ Ss1Ss2=10S_{s1}S_{s2}=10Ss1​Ss2​=10 ,结果负溢

​ ④ Ss1Ss2=11S_{s1}S_{s2}=11Ss1​Ss2​=11 ,结果为负数,无溢出

00,1011+00,0111=01,0010(正溢)

11,1011+11,0111=10,1110(负溢)

补码原码反码溢出问题相关推荐

  1. 补码原码反码简单理解

    补码原码反码简单理解 看到一句I2S的data是以补码形式来表现数据.再次查阅得出以下只管结论: ####1,首先直观举例机器里面是如何存放有符号数的:#### 1在机器里面表示为 0000 0001 ...

  2. 计算机原理原码反码,计算机原理 计算 —11011011补码( ) 原码( ) 反码( )11001010补码 原码 反码...

    -11011011补码( 100100101 ) 原码(111011011 ) 反码(100100100 ) 11001010补码 11001010 原码 11001010 反码 11001010 ( ...

  3. 补码 原码 反码

    假设有一个 int 类型的数,值为5,那么,我们知道它在计算机中表示为: 00000000 00000000 00000000 00000101 5转换成二制是101,不过int类型的数占用4字节(3 ...

  4. 由Python位运算到原码反码补码

    采用书籍Python核心编程(第二版),人民邮电出版社,2008年7月第1版.本书以Python2.5为主,但笔记主要以Python3.6为主. 一.Python位运算操作符 Python支持标准位运 ...

  5. 原码 反码 补码 之间在小数正数间的转换

    原码 反码 补码 之间在小数正数间的转换 基本转换 对于正数 原码等于反码等于补码(小数也一样) 对于负数 原码除了符号位取反即反码 反码基础之上+1即补码 但是在遇到某些题时候还是会混淆,比如三者在 ...

  6. 关于计算机中 原码, 反码, 补码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  7. 原码, 反码, 补码, 移码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  8. 原码 反码 补码 详解

    一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放 ...

  9. python二进制反码例题_python中的进制转换和原码,反码,补码

    python中的进制转换和原码,反码,补码 计算机文件大小单位 b = bit 位(比特) B = Byte 字节 1Byte = 8 bit #一个字节等于8位 可以简写成 1B = 8b 1KB ...

最新文章

  1. 从零开始_学_数据结构(六)——排序(冒泡、插入、希尔、简单选择、归并、快速)...
  2. Golang 标准库提供的Log(一)
  3. ESD二极管 DW12P4N3-S 电压12V 封装DFN2020-3L
  4. 论文浅尝 | Iterative Cross-Lingual Entity Alignment Based on TransC
  5. 面试阿里,我还是挂在了第四轮……
  6. 超声乳化设备行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  7. myeclipse新建JSP中DOCTYPE问题
  8. c语言gui程序,GUI编程
  9. 1000人系统服务器配置,win云服务器在线1000人配置
  10. python abs的功能_Python Pandas DataFrame.abs()用法及代码示例
  11. PHP之mb_convert_case使用
  12. 某试卷由26道题c语言,c语言模拟试题
  13. FINVASIA集团宣布收购ActTrader
  14. 配置vscode C语言运行环境(保姆级教程)
  15. elasticsearch-java客户端测试
  16. php 百度收录api_PHP查询百度收录API接口源码
  17. Sigrok逻辑分析仪软件(基于CY7C68013A)
  18. 蜂窝通信模组,是物联网终端的核心组件之一
  19. 单链表的基本操作,建立单链表,插入删除等
  20. 数字签名算法---加密学习笔记(五)

热门文章

  1. Qt 5.14.2 使用 MaintenanceTool.exe 添加组件
  2. 计算机更改用户后 无法联网,路由器修改密码后电脑无法上网如何解决
  3. python换行写入文件
  4. 2.《如何构建敏捷项目管理团队》之追求高绩效(摘要)
  5. 计算机社团英语宣传,社团宣传 | 计算机爱好者协会闪亮登场!
  6. Linux操作系统基础 (一)Linux 登录方式及常用快捷键
  7. 德艺双修才貌双全 史上16位青楼佳人 莘瑶琴喜嫁卖油郎
  8. php语言头像,使用PHP语言通过邮箱获取全球公认的Gravatar头像地址
  9. 从今天开始,没有「Office」了!
  10. 使用left join比直接使用where速度快的原因