我们都了解2进制8进制和16进制的转化
也知道了数据在内存中存储的时候都是二进制的形式存储的。
那么什么事原码、反码和补码呢 其实他们都是二进制。只不过是二进制的不同的表现形式。
下面举例子,例如:
1.原码
最高位表示符号位。剩下的位数,是这个数的绝对值的二进制
就比方说 一个完整的int型变量在内存中占的是4个字节,32位的编译器中 那么这时候他的二进制表示是00000000 00000000 00000000 00000000
所以
10的原码就是00000000 00000000 00000000 00001010
那么负数的原码就是例如
-10的原码10000000 00000000 00000000 00001010
符号位是第一位 0为正数 1为负数
2.反码
正数的反码和其原码是一样的
附属的反码就是在其原码的基础上 符号位不变 其他位取反。
10的反码就是 00000000 00000000 00000000 00001010 和上面一样
-10的反码就是11111111 11111111 11111111 11110101 和上面1和0是相反的
3.补码
正数的补码就是其原码
附属的补码就是在其反码的基础上+1
10的补码就是00000000 00000000 00000000 00001010
-10的补码就是 11111111 11111111 11111111 11111011
总结
10
10的原码:00000000 00000000 00000000 00001010
10的反码:00000000 00000000 00000000 00001010
10的补码:00000000 00000000 00000000 00001010
-10
-10的原码:00000000 00000000 00000000 00001010
-10的反码: 11111111 11111111 11111111 11110101
-10的补码: 11111111 11111111 11111111 11111011
任何数据都是以其二进制的补码形式存储在内存中的
为什么数据要以补码的形式存储呢?
因为计算机中只有加法没有减法.为了更加低成本的计算出结果,所以使用补码来存储数据.
计算机中只有加法没有减法.为了更加低成本的计算出结果,所以使用补码来存储数据.
下面我们看一个例子 这个例子也是我看的时候特别能帮助我理解的 清晰明了,例如 :
3 + 2;
3 - 2; 这个减法运算对于计算机而言它的理解是 3 + (-2); 1
使用原码计算.
3的原码 00000000 00000000 00000000 00000011
-2的原码 10000000 00000000 00000000 00000010
----------------------------------------------------
10000000 00000000 00000000 00000101 结果是1个负数明显是不对的
使用反码计算.
3 的反码: 00000000 00000000 00000000 00000011
-2的反码: 11111111 11111111 11111111 11111101
--------------------------------------------------
00000000 00000000 00000000 00000000 0
使用补码计算
3 的补码: 00000000 00000000 00000000 00000011
-2的补码: 11111111 11111111 11111111 11111110
-------------------------------------------------
00000000 00000000 00000000 00000001 1
注:使用补码来做运算效率是最高的.