有任何不懂的问题可以评论区留言,能力范围内都会一一回答
我们上一章讲了十进制整数如何转换成原码,但是计算机内部储存计算的都是补码,为什么不用看起来更好换算的补码呢,因为计算机内部(cpu只有加法器)所以计算a-b这样的运算只能通过a+(-b)计算,这个时候如果用原码计算会出现很大的问题,
举个例子
1 的原码是0000 0001
-1的原码是1000 0001
这两个原码相加得到 1000 0002 也就是-2
这显然是不合理的,但是问题出现在哪呢,问题就出现在符号位了
符号位原本是作为表示正负的,一旦参与相加的计算,就会被当作值参与计算,这个时候就会出问题
那么怎么解决这个问题呢?
于是就出现了补码
原码计算出问题的归根到底的原因是因为符号位出问题了,或者说符号位不统一,
因此我们规定,非负数的原码补码反码都是一样的
对于负数
我们就要对原码进行一些操作来获得补码了
要得到补码得先得到反码
反码就是原码符号位不变数值位全部取反,比如,
-1的原码是 1000 0001
-1的反码就是 1111 1110
负数的补码等于其补码+1
因此-1的补码就是 1111 1111
因此这个时候
-1的补码 1111 1111
1的补码 0000 0001(非负数的原码反码补码一样)
其补码相加就是1 0000 0000
溢出的那一位会自动被截断,
因此得出结果是0000 0000(补码)
但是由于非负数原码补码反码相同
所以0000 0000(补码)的原码也是0000 0000 及换算成十进制正数也就是0
所以1+(-1)=0;这个地方计算就对了,但是还有一个问题就是补码的底层逻辑是啥?
为啥原码解决不了的问题补码可以做到呢?
这个地方比较麻烦,放在下章节讲解