一、原码、补码、反码
1.原码、补码、反码
机器数:一个数在计算机中的二进制表示形式。机器数是带符号的,第一位表征正负,0为正,1为负。比如+3,计算机字长为8位,00000011,-3是10000011
真值:因为第一个数为符号位,所以机器数的形式不等于真正的数值,所以为区别起见,将带符号位的机器数对应的真正数值成为机器数的真值。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
2.原码、反码、补码的基本概念和计算方式
原码、反码、补码是机器存储一个具体数字的编码方式
- 原码
符号位加上真值的绝对值,如果是八位二进制,第一位是符号位
[+1]原 = 0000 0001
[-1]原 = 1000 0001
取值范围:[1111 1111 , 0111 1111]即[-127 , 127]
原码是人脑最易于理解的方式
-反码
正数的反码是其本身,负数的反码是符号位不变,其余各位取反
如果是负数的反码,看不出来数值的真实大小,需要先转为原码再计算
- 补码
正数的补码是自身,负数的补码是原码的符号位不变其余各位取反,再加一,相当于反码加一
负数的真是数值也无法直接看出,需要先转为原码
2.为什么要使用原码、反码、补码
由于简化机器运算,所以机器只有加法没有减法。原码和反码都无法解决有负数的加法,因此出现了补码,以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128
(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补
这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-231, 231-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.
网友评论