咱们不整那些文字描述有的没的,直接上干货!
原反补码计算方法
原码直接将二进制按照正负数的形式翻译成二进制就可以。反码将原码的符号位不变,其他位依次按位取反就可以得到了。补码将得到的反码+1即可。
int a = 5;
int b = -5;
此时a中的5转化为二进制是 00000000 00000000 00000000 00000101 即为原码。
而正整数的原反补码相同,所以5的反码和补码均和上面一行所写一致。
此时b中的-5转化为二进制是10000000 00000000 00000000 00000101 即为原码。
负整数的反码是符号位不变,其余按位取反得到 11111111 11111111 11111111 11111010
负整数的补码为反码+1得到 11111111 11111111 11111111 11111011
数据的储存
对于整形来说:数据存放内存中其实存放的是补码。 那为什么呢?在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域 统一处理; 同时,加法和减法也可以统一处理(CPU 只有加法器 )此外,补码与原相互转换,其运算过程是相同的,不需要额外的硬件电路。
直接上例子
如让计算机计算5-5,因为CPU只有加法器,所以计算机会将其表达式转化为5+(-5)在内存中运算。如果内存中存放的是原码的话,就会出现以下问题
5的原码为 00000000 00000000 00000000 00000101
-5的原码为 10000000 00000000 00000000 00000101
相加得到 10000000 00000000 00000000 00001010
转化为十进制为-10,显然不是想要的结果,所以内存中不是原码存放。
内存中存放的是补码时:
5的补码为 00000000 00000000 00000000 00000101
-5的补码为 11111111 11111111 11111111 11111011
相加得到 1 00000000 00000000 00000000 00000000
第33位溢出,所以只取后32位数字转化为十进制得到 0,符合结果
即证明了内存中存放的是补码