深入理解计算机系统系列--[转] 计算机为什么用补码
2013-10-24 11:18
274 查看
转自 http://blog.csdn.net/bendanban/article/details/8681456
计算机使用补码表示负整数!正整数就用源码来表示。那什么是补码呢?其实源码的补码就是源码的相反数,他们相加得0 。
例如:如果我们用8位来表示有符号整数的话,那么十进制1用二进制表示为:
[cpp]
00000001
这个数取反加1的结果是:
[cpp]
11111111
所以,-1的补码就是11111111。
大家可能会有疑问,到底什么是补码,为什么-1的补码不是-1的源码取反加1呢?
这是因为:-1的补码是1的补码表示法。所以计算机里用1的相反数(就是-1的补码)来表示-1 。
看例子:
假设给了一个数:
[cpp]
view plaincopy
10000100
看符号位为1,为负数,所以这个数是用补码表示的!先计算源码。
各位取反加1的结果是:
[cpp]
view plaincopy
01111100(二进制) = 124(十进制)
所以原先给出的二进制数的十进制数是 -124 。
其实他的补码就是124的二进制数求补的结果。
124的二进制数为:01111100
取反 :10000011
加1 :10000100
所以-124的二进制补码表示就是10000100
例如执行2-1这个操作,我们可以用2+(-1)来计算。
2的二进制数是:00000010
1的二进制数是:00000001 --> -1的二进制补码是:11111111
所以2+(-1):
[cpp]
00000010
+ 11111111
----------------
00000001
结果是1。
我们再看个结果为负数的。
求1-2的结果,用1+(-2)来计算。
2的二进制数是:00000010,所以-2的二进制数为:11111101+1=11111110
1+(-2)的计算过程是:
[cpp]
00000001
+ 11111110
---------------
11111111
这个结果的十进制数是多少呢?
首先它是个负数,说明结果使用补码表示的,将各位取反加1后的结果是00000001=1(十进制),然后加上他的符号,就是-1了,
所以1+(-2)的结果是-1 。
用补码计算确实简化了ALU的设计难度!!所以计算机用补码来表示负整数!!!!
应该看明白了。。
计算机使用补码表示负整数!正整数就用源码来表示。那什么是补码呢?其实源码的补码就是源码的相反数,他们相加得0 。
计算负整数的补码:
规则就是源码各位取反,然后加1得到。例如:如果我们用8位来表示有符号整数的话,那么十进制1用二进制表示为:
[cpp]
00000001
这个数取反加1的结果是:
[cpp]
11111111
所以,-1的补码就是11111111。
大家可能会有疑问,到底什么是补码,为什么-1的补码不是-1的源码取反加1呢?
这是因为:-1的补码是1的补码表示法。所以计算机里用1的相反数(就是-1的补码)来表示-1 。
计算二进制有符号数的十进制数
既然有符号数在计算机里有补码表示负整数,那我们如何根据给定的二进制数来计算十进制数呢?看例子:
假设给了一个数:
[cpp]
view plaincopy
10000100
看符号位为1,为负数,所以这个数是用补码表示的!先计算源码。
各位取反加1的结果是:
[cpp]
view plaincopy
01111100(二进制) = 124(十进制)
所以原先给出的二进制数的十进制数是 -124 。
计算负整数的二进制补码表示
继续刚才那个例子,如果我们拿到的是十进制-124,那么他的二进制补码是多少呢?其实他的补码就是124的二进制数求补的结果。
124的二进制数为:01111100
取反 :10000011
加1 :10000100
所以-124的二进制补码表示就是10000100
为什么使用补码表示负整数
原因很简单,如果使用补码表示负整数,那么ALU在做整数之间的操作时,就不用区分符号了,所有位都会参与运算,其上上面的例子中,符号位都参与了运算。例如执行2-1这个操作,我们可以用2+(-1)来计算。
2的二进制数是:00000010
1的二进制数是:00000001 --> -1的二进制补码是:11111111
所以2+(-1):
[cpp]
00000010
+ 11111111
----------------
00000001
结果是1。
我们再看个结果为负数的。
求1-2的结果,用1+(-2)来计算。
2的二进制数是:00000010,所以-2的二进制数为:11111101+1=11111110
1+(-2)的计算过程是:
[cpp]
00000001
+ 11111110
---------------
11111111
这个结果的十进制数是多少呢?
首先它是个负数,说明结果使用补码表示的,将各位取反加1后的结果是00000001=1(十进制),然后加上他的符号,就是-1了,
所以1+(-2)的结果是-1 。
用补码计算确实简化了ALU的设计难度!!所以计算机用补码来表示负整数!!!!
应该看明白了。。
相关文章推荐
- 深入理解计算机系统(2.4)------整数的表示(无符号编码和补码编码)
- 深入理解计算机系统(序章)------谈程序员为什么要懂底层计算机结构
- 深入理解计算机系统(序章)------谈程序员为什么要懂底层计算机结构
- 深入理解计算机系统-之-数值存储(三)-- 原码、反码、补码和移码详解
- 深入理解计算机系统(2.4)------整数的表示(无符号编码和补码编码)
- CSI系列-读<深入理解计算机系统>
- [深入理解计算机系统]数据储存-大小端法与补码
- 深入理解计算机系统(3)
- 转深入理解计算机系统第二章答案。。
- 程序的机器级表示 读深入理解计算机系统
- (深入理解计算机系统) 实时系统
- 深入理解计算机系统(第三版) 练习2.13
- 深入理解计算机系统 ——第三章 程序的机器级表示
- 深入理解计算机系统——第05章——优化程序性能
- 深入理解计算机系统(第三版) 练习2.15
- 深入理解计算机系统第一章学习笔记
- 深入理解计算机系统第二版习题解答CSAPP 2.1
- 深入理解计算机系统 - 练习题 - 第三章 (练习题3.32)
- 1、深入理解计算机系统 笔记,系统综述
- 深入理解数据库原理系列(1)---日志系统原理