通常的定义为:
原码为正时,其补码就是原码本身
例如: 47原码为 00101111 补码为 00101111
当原码为负时,其补码为原码除符号位其它取反再加1
例如: -30原码为 10011110 补码为 11100010
如果不想硬背原码补码中那些取反+1的东西,可以接着看下去
But!!!!
很多人不能理解其原理
但其实在计算机中,本就没有原码的概念,所有数字都是按照补码存储的!
补码定义:
设A,B两个数字,若A+B恒等于一个规定的数,则称这两个数互为补码。
注意!这里的数字不是我们规定的原码。
所以你会发现正数的原码+补码不是一个固定的数字
但是负数的原码+补码恒等于100000000
那现在来抛开规定的原码转补码的理论!
数字5的二进制是 00000101
那么其补码是 100000000 - 00000101 = 11111011
11111011?
觉不觉得很熟悉?
这就是 -5 的补码
现在可以理解为在补码中 100000000 - A = -A
所以如果要求一个原码为负数的补码,直接求它绝对值的补码就行。
举个例子,-120的补码,就等于100000000 - 01111000(120的2进制) = 10001000
现在利用这种理论来看看二进制数的加法
例如 A + B(其中 A > 0,B < 0)
如果 A + B > 0
则这两个数字的补码之和肯定是大于100000000的
原因是将 A 拆分成(-B)加上另外一个值,带入到原式子中 其中B-B就等于100000000,再加上A拆分出的另外一个正值就肯定大于100000000,而我们认为B-B同时也等于0,所以相加结果多出来的那100000000我们便舍去了,只考虑后8位
如果 A + B < 0
则这两个数字的补码之和肯定是小于100000000的
综上所述,原码只是教程中用来方便我们理解补码的中间量,如果不想硬背那些取反+1的东西可以参考我上面的说明。
该文章为个人理解,若有错误欢迎讨论。