一、原码、反码、补码
1、在计算机中,整数值都是以补码的形式存储与运算;
2、为了提升计算机运算效率,补码的形式可以使计算机只需要实现加法就行了。
3、原码、反码、补码
以8位二进制举例,第一位是符号位(0-正;1-负);剩下的7位都表示实际数值。
原码:符号位+实际数值。表示范围[-127, 127]
反码:符号位。 表示范围[-127, 127]。
正数的反码:与原码一致;
负数的反码:符号位不变,实际数值位取反。
补码:符号位。 表示范围[-127, 127]。
正数的补码:原码一致;
负数的补码:符号位为1,实际数值位取反之后再加1。
补码转换为原码:符号位不变,其他位取反之后再加1
原码 | 反码 | 补码 | |
10 | 00001010 | 00001010 | 00001010 |
-10 | 10001010 | 11110101 | 11110110 |
通常情况下,补码不使用符号位。0000 0000~1111 1111,即0~255,共256个数字,[0, 255]。
二、补码运算
基于时钟(模12):8-2 =8+(-2) =8+10(2的补数)=6点
基于二进制(模256):8-2=8+(-2) =8+(256-2)(即2^8-2)
=(补)[0000 1000]+(补)[1111 1110] =(补)[1 0000 0110]
=结果共9位,但是只能保存8位,会将最高位1舍去,从而运算结果为:(补)[0000 0110]=6
三、补码运算原理
概念
1、模:表示值的范围。模型如时钟一圈,其模是12;8位二进制00000000 ~ 11111111(0~256),其模为256
2、补数:a的补数为(模-a)举例子8的补数为4(即00001000的补数为11111000)
推理
A=2(十进制)= 0000 0010(二进制)
B= 取反A = 1111 1101
C= B + 1 = 1111 1110 =254(即2^8-2)
其中,A + C = A+(B+1) = A+(取反A+1) = 10000 0000 =256(即2^8,即为8位二进制模)
则,A与C(取反A+1)互补