上学的时候就记住了下面这些:
原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示。
机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。
机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。
当时并没有过度深究, 就只是记住而已。
最近研究8位机-128的补码的时候深入学习了下,总结下。
首先说一下补的概念,个人理解:
对于一个时钟,7点,再过8个小时:
7 + 8 = 15,也就是3点 即7 + 8 - 12 = 3;
从数学的角度来看,上式等于7 + (8 - 12) = 3
其含义就是先算出了8的补,然后加上这个数
主要原因就是因为前面的相加操作发生了溢出(15 > 12)
有这样一种说法,根本就没有符号位,最高位其实就是用来取模的 **
https://www.zhihu.com/question/20159860
感觉这个理解很到位
即加法操作产生溢出后需要减去模值
在补码运算中最高位用来表示模**,可以判断出原有的数是正数还是负数,所以变成了符号位,是自然形成的符号位
00000001(补码),0000001(原码) - 00000000 (原码)= 0000001 即为1
10000001(补码),0000001(原码) - 10000000 (原码)= 10000001 即为1-128 = -127,-127的补码就是10000001
那么,-128的补码就是00000000(原码)-10000000(原码),最高位为0,其他位都为1
还有一种理解方式:
计算机中,8位,能表示256个数字是显然的
0 - 255
但是人们不满足于只能表示正数啊,所以要有负数存在
而且计算机是不能执行减法操作的
因此就有了原码的诞生,最高位用来做符号位
但是,其中有一个问题就是计算机在执行加法操作的时候,如:
1 + (-1) = 0;
00000001 + 10000001 = 10000010
结果却是-2,这显然不对啊
所以就有了反码的诞生,专门用来处理负数,上述加法变为
00000001 + 11111110 = 11111111
而此时-0的反码即为1 1111111
此时的表示范围为0 ~ 11111111
所以能表示-127 ~ 127
但是问题是此时还有一个+0的存在,其反码就是他自己
这样子就带来一个问题就是有两个0的存在,表示方式还不一样。
这个时候,我们发现-0(11111111) 加上1就变成1 00000000,由于最高位溢出,故此时值为+0,那么就将这个值定义为0,两个0的情况也没有了
补码就是这个概念,即反码+1
即整个环往前走了一步,其他数往前走了一步都有替代者,但是11111111往前一走就溢出了,变成了00000000
所有的正负加减=0的操作本来都是-0,现在都是溢出然后取+0
这样一来原本的所有值都在原本的反码的基础上+1,那么原本的
-1的原码是10000001,反码是11111110,现在补码是11111111
-127的原码是11111111,反码是10000000,现在补码是10000001
那,既然都往前走了一位,那现在补码10000000表示谁呢?
从-1到-127都有自己的反码和补码,也就是说,多出来一个数(两个0变成一个0产生的历史遗留问题),最高位还是1,所以就给了-128
网友评论