最近在看《深入理解计算机系统》,学习编程的一些基本的东西,还是觉得很有意思的。
今天看到了补码编码这一节。
最常见的有符号数的计算机表示方式就是补码(two‘s-complement)形式。在这个定义中,将字的最高有效为解释为负权(negative weight).我们用函数B2Tw(Binary to Two‘s-complement的缩写,长度为w)来表示。
最高有效位xw-1也称为符号位,它的"权重"为-2w-1,是无符号表示中权重的负数。符号位被设置为1时,表示值为负,而当设置为0是,值为非负。
仔细看前面那个公式,尤其是前面的-xw-12w-1
那常见的32位整数来看,如果数值为
11111111 11111111 11111111 11111111
= -1*231 + 1*230 + 1*229 + 1*228 +...+ 1*21 + 1*20
=-231 + (231 - 1)//不要问这个结果怎么来的,XXX-_-||求和公式....
=-1
那好,其他的呢?
11111111 11100011 11011101 11110011
= -1*231 + 1*230 +...+ 1*221 + 1*217 +...+ 1*214 + 1*212 + 1*211 + 1*210 + 1*28+...+ 1*24+ 1*21+ 1*20//少了2/3/9/13/18/19/20
= -1*231 + (1*230 + 1*229 + 1*228 +...+ 1*21 + 1*20) - 22 - 23 - 29 - 213 - 218 - 219 - 220
=-231 + (231 - 1) - 22 - 23 - 29 - 213 - 218 - 219 - 220
=- 1 - 22 - 23 - 29 - 213 - 218 - 219 - 220
看到这里是不是想起了什么了?
对了,就是常用的负数的二进制表达式的写法。
37(int32)的二进制表达式为 00000000 00000000 00000000 00100101
-37的写法呢:
首先反码:11111111 11111111 11111111 11011010,值是多少?
11111111 11111111 11111111 11011010 = -1 - 20 - 22 - 25 = -37-1
所以在反码的基础上,我们还要+1,才能得到-37的二进制码:
11111111 11111111 11111111 11011011 = -1 - 22 - 25 = -37