有符号数和无符号数详解(2)补码详解
有符号数和无符号数详解(2)补码详解
- 1. 为什么需要补码
- 1.1 背景
- 2 补码的思想
- 2.1 我们希望只设计加法运算器,不用减法运算器。
- 2.2 现在问题是:怎么表示-1呢?
- 3. 补码
- 3.1 补码的优点
- 3.2 例子:
- 4. 补码的本质:
- 参考
有符号数和无符号数详解
https://blog.csdn.net/lqy971966/article/details/106033332
1. 为什么需要补码
大多数计算机对整数使用二进制补码编码表示!!!
1.1 背景
(只设计加法运算器)
在计算机内,整数的长度是确定的,在字长为32位的计算机中,整数的长度就是32个二进制,这其中还包括了符号位(0表示正,1表示负)。
这里面我们为了方便描述,就假设机器字长为8位。
例如,十进制整数 19,二进制真值表示为 10011,其原码表示为 0001 0011。
十进制整数-19,二进制真值表示为-10111,原码表示为 1001 0011。
简而言之,源码就是最高位为符号位,其他位表示该数的绝对值
如果计算机内部采用原码表示数,那么在进行加法和减法运算的时候,最终都转化为两个绝对值的加运算和减运算,
因此,在设计计算器的时候就既需要设计加法运算器,又要设计减法运算器(代价有点大,是否可以就用一种类型的运算器呢?
其实大多数人都喜欢做加法运算,不太喜欢用减法运算)。
2 补码的思想
(从-1的由来说起)
2.1 我们希望只设计加法运算器,不用减法运算器。
我们希望找到一种方案,采用这种方案做加运算 1 + ( -1 )
用 0000 0000表示0是很自然的想法,用 0000 0001到 0111 1111表示1到127的正数,也是自然的想法
2.2 现在问题是:怎么表示-1呢?
我们做一次逆向思维,0000 0001加上什么样的二进制数可以得到0000 0000?
即:从右向左思考,加数的最右边的最低位必须是1
即:0000 0001 + (1111 1111)= 1 0000 0000
无论结果最后是多少,都只保留8位,多余的位会被丢弃。因此,我们可以将 1111 1111来表示-1
下面就是采用一种方式来合理的将-1怎么变成 1111 1111这种形式。
3. 补码
(解决了只设计加法运算器,不设计减法运算器)
带符号整数有原码、反码、补码等几种编码方式。
正整数的原码、反码和补码都一样
负数的反码是对原码的除符号位外的其他位进行取反后的结果
而补码是先求原码的反码,然后在反码的末尾位加1后得到结果,即补码是反码+1
3.1 补码的优点
它的便利体现在,所有的加法运算可以使用同一种电路完成。
3.2 例子:
以-8作为例子。
假定有两种表示方法。一种是直觉表示法,即10001000;另一种是-8补码表示法,即 1111 1000
随便写一个计算式,16 + (-8) = ?
16的二进制表示是 00010000,所以用直觉表示法,加法就要写成:
00010000
+10001000
---------
10011000
可以看到,如果按照正常的加法规则,就会得到10011000的结果,转成十进制就是-24。显然,这是错误的答案。
也就是说,在这种情况下,正常的加法规则不适用于正数与负数的加法。
因此必须制定两套运算规则,一套用于正数加正数,还有一套用于正数加负数。
从电路上说,就是必须为加法运算做两种电路。
现在,再来看 8 的补码表示法。
00010000
+11111000
---------
100001000
可以看到,按照正常的加法规则,得到的结果是100001000。
注意,这是一个9位的二进制数。我们已经假定这是一台8位机,因此最高的第9位是一个溢出位,会被自动舍去。
所以,结果就变成了00001000,转成十进制正好是8,也就是16 + (-8) 的正确答案。
展到整个整数集,从而用一套电路就可以实现全部整数的加法。
4. 补码的本质:
要将正数转成对应的负数,其实只要用0减去这个数就可以了。
比如,-8其实就是0-8。
已知8的二进制是00001000,-8就可以用下面的式子求出:
00000000
-00001000
---------
11111000
0不够借,最高位借1
补码的两个转换步骤就是这么来的。
参考
https://blog.csdn.net/m0_37955444/article/details/79848485
有符号数和无符号数详解(2)补码详解相关推荐
- 有符号数和无符号数详解
有符号数和无符号数详解 1. 通过例子看问题 2. 有符号数和无符号数 2.1 什么是无符号数 ? 2.2 什么是有符号数 ? 2.3 有符号数和无符号数的区别 3. 原码.反码.补码 3.1 背景 ...
- 有符号数与无符号数比较-详解
正如我们所知道的,编程语句都有很多的基本数据类型,如char,inf,float等等,而在C和C++中还有一个特殊的类型就是无符号数,它由unsigned修饰,如unsigned int等.大家有没想 ...
- 【考研计组】有符号数与无符号数之间的转换
楼主有话要说: 在复习<计算机组成原理>时,遇到了有符号数与无符号数之间转换的问题,为了应对这类问题,楼主仔细查阅资料再结合做题总结出一些心得,内容如下(如果有新的总结,会反复修改): 注 ...
- java中有符号数和无符号数,C语言中无符号数和有符号数之间的运算
C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. unsigned int和int进行运算 ...
- 理解有符号数和无符号数的区别
理解有符号数和无符号数 回头看上一节,我们所讲的数都是正数.同样是年纪和工资,前者不需要有负值,但后者可能需要--至少所有的老板都这样认为. 那么,负数在计算机中如何表示呢? 这一点,你可能听过两种不 ...
- c语言中的无符号字节,C语言之有符号数和无符号数
我们知道,在C语言中存在无符号数和有符号数(一些高级语言如Java里面是没有无符号数的),但是对于计算机而言,其本身并不区别有符号数和无符号数,因为在计算机里面都是0或者1,但是在我们的实际使用中有时 ...
- C\C++不经意间留下的知识空白------有符号数和无符号数
C和C++ C和C++应该是大多数工科生最先接触的两门语言,个人感觉这两门还是挺难的.今天在看面试题时,看到有符号数和无符号数时竟然懵了,这基础是有多不扎实啊! 有符号数和无符号数 对于浮点数来说都是 ...
- 各种类型sizeof大小及C++有符号数与无符号数进行比较
不同类型sizeof相关: class A {}; class B { char m_data;}; class C {char m_data[100]; }; class D {char* m_da ...
- 11-有符号数和无符号数
1. 有符号数和无符号数 无符号数,因为没有符号位,所以只能表示一个正数. 有符号数,因为存在符号位,符号位如果是0的话,代表这是一个正数,符号位如果是1的话,代表这个数是一个负数. 我们可以用db伪 ...
最新文章
- 【Android 高性能音频】AAudio 音频流 缓冲区 简介 ( AAudio 音频流内部缓冲区 | 缓冲区帧容量 | 缓冲区帧大小 | 音频数据读写缓冲区 )
- 中国SaaS死或生之三:SaaS SCM能否上演绝地求生?
- c fread 快读 详解_奔驰ACC(自适应巡航系统)详解
- mysql php 空格函数_MySQL_mysql 强大的trim() 函数,mysql中的去除左空格函数: LTRI - phpStudy...
- gmm中隐变量是什么的_隐变量是什么?
- MATLAB的7种滤波方法(重制版)
- 倍福plc的型号_倍福模块选型
- python数据分析练手小项目-汽车销售偷漏纳税人识别
- 新浪20年:独行侠的影响力之路
- css背景图片和背景颜色一起显示
- arxiv数据_使用neo4j第1部分分析arxiv数据
- java sql2005驱动_sqljdbc.jar下载-sqljdbc.jar 2005下载官方版-jdbc连接数据库mssql驱动西西软件下载...
- Python编辑器UliPad安装
- 纯翻译 GMSL2-CSI2 MAX9295和MAX9296配对通用过程 编程指南
- 马其顿驱动电源项目调光LED闪烁原因
- 【企业网盘】公有云和私有云的9大差异 | 燕麦企业云盘(OATOS企业网盘)
- js 页面跳转两种方式(原页面跳转,打开新标签页)
- 数字孪生与3D可视化
- 5.8 前端开发日报
- java用模板生成word(docx)文档(含动态表格)