源码反码补码
- 计算机中常见数据的分类
- 机器数&真值
- 原码
- 反码
- 补码
- 扩展知识
计算机中常见的数据的分类
- 数据分类
- 数值类型
- 整数
- 浮点数
- 非数值类型
- 图片
- 视频
- 音频
- 文字
- 数值类型
机器数
- 机器数:数值在计算机中的二进制表示形式。机器数是带有符号的。
- 机器数的最高位是符号位,0表示正数,1表示负数
- int -> 整数 4个字节 32位 -2^31- 2^32-1,最高位为符号位
真值
- 机器数所对应的二进制的真正的数值
- 1000 0111=-7 -7就是1000 0111 的真值
原码
-
原码就是符号位加上真值的绝对值
-
正数:符号位 有效位 +11 000 1011
0 000 1011 —> 1000 1011
-
负数:符号位 有效位 -15 000 1111
1 000 1111 —> 1000 1111
-
求原码:
34 0010 0010
-39 1010 0111
-55 1011 0111
反码
正数:正数的反码等于原码
-
负数:符号位不变,其余各位逐一取反,
-49 原码 1011 0001 反码 1100 1110
-36 原码 1010 0100 反码 1101 1011
补码
- 正数:正数的补码等于原码
- 负数:负数的补码等于反码加一
-65 原码 1100 0001 反码 1011 1110 补码 1011 1111
-37 原码 1010 0101 反码 1101 1010 补码 1101 1011
-120 原码 1111 1000 反码 1000 0111 补码 1000 1000
扩展知识
为什么需要原码和补码?
在设计计算机时,只设计了加法器,没有设计减法器;
5-3=5+(-3)
原码
5=0000 0101
-3=1000 0011
相加后: 1000 1000=-8 不对
说明原码不能直接相加
反码
解决了只设计了加法器,使用加法器进行减法运算的问题
缺点:正负相加等于0的表示不唯一
如 1 +(-1)=0
0000 0001 + 1000 0000 =1111 1111[反] =1000 0000[原]=-0
0的表示不唯一
将补码转换为原码
补码减一,取反
-
把补码当原码,求补码
1000 0000 1000 0000 == -128
反码 1111 1111 0111 1111
补码 1111 1111 1000 0000