在计算机中整数存储的是数据的补码
原码:
正数直接使用二进制数来表达
eg: a=100 在内存中保存为 0000 1100 110
反码:
符号位不变 ,其他位取反
//以一个字节数据为例
char num1 = 7; //原码 0000 0111 反码 0000 0111
char num2 = -7; //原码 1000 0111 反码 1111 1000
从上述的num1和num2可以看出,原码无法进行减法运算
num1与num2相加,得到1111 1111 转为原码得到1000 0000 得到-0。 若num1不等于num2 计算结果会出错,所以需要用到补码来进行数值的运算
补码:
若数字为正数,反码就是原码
若数字为负数,反码等于原码取反码后对值加一(符号位不动)
- 补码 1000 0010 反码 1000 0001 原码 1111 1110 即 -126
- 补码 1000 0001 反码 1000 0000 原码 1111 1111 即 -127
- 补码 1000 0000 唯一一个只有补码没有源码反码的数字, 强制设置其为 -128
一个字节的有符号整形 hhd% 取值范围 127 ~ -128
7 与 -7相加
7 原码 0000 0111 反码 0000 0111 补码 0000 0111
-7 原码 1000 0111 反码 1111 1000 补码 1111 1001
补码相加 0000 0000 即 0
7 与 -6相加
7 原码 0000 0111 反码 0000 0111 补码 0000 0111
-6 原码 1000 0110 反码 1111 1001 补码 1111 1010
补码相加 0000 0001 即 1
6 与 -7相加
6 原码 0000 0110 反码 0000 0110 补码 0000 0110
-7 原码 1000 0111 反码 1111 1000 补码 1111 1001
补码相加 1111 1111 转反码 1111 1110 原码 1000 0001 即 -1
Comments NOTHING