计算机中的补码是什么?
欢迎关注Julia语言微信公众账号 julia_language
原文链接:http://suo.im/4SltFb
简介
计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
- 正整数的补码是其二进制表示,与原码相同
- 求负整数的补码,将其对应正数二进制表示所有位取反(包括符号位,0变1,1变0)后加1
具体怎么算
Julia中,可直接在二进制,八进制和十六进制数前面加上一个负号 - ,就可以获得其补码:
julia> -0x5
0xfb
julia> -0x0002
0xfffe
-0x5是16进制的-5,且类型是UInt8。将其对应正数(也就是5)用二进制表示就是0000 0101。然后按位取反变为1111 1010,然后再加1,变为1111 1011。转换为16进制就是0xfb。
-0x0002是6进制的-2,且类型是UInt16。将其对应正数(也就是2)用二进制表示就是0000 0000 0000 0010。然后按位取反变为1111 1111 1111 1101,然后再加1,变为1111 1111 1111 1110。转换为16进制就是0xfffe。
为什么要有补码
原因很简单,如果使用补码表示负整数,那么算术逻辑单元ALU(Arithmetic and Logic Unit)在做整数之间的操作时,就不用区分符号了,所有位都会参与运算。
例如执行2-1这个操作,我们可以用2+(-1)来计算。
2的二进制数是:00000010
1的二进制数是:00000001 --> -1的二进制补码是:11111111
所以2+(-1):
00000010
+ 11111111
----------------
00000001
求1-2的结果,用1+(-2)来计算。
2的二进制数是:00000010,所以-2的二进制数为:11111101+1=11111110
1+(-2)的计算过程是:
00000001
+ 11111110
---------------
11111111
首位是1,说明是个负数,即是使用补码表示的,将各位取反(00000000)加1后的结果是00000001=1(十进制),然后加上他的符号,就是-1了,
所以1+(-2)的结果是-1 。
用补码计算确实简化了ALU的设计难度!!所以计算机用补码来表示负整数!!!!
