补码 原码 反码
最近开始在学习java,了解到补码反码原码的概念,写一篇文章,加深记忆,并检验自己是否真的了解了。
一、原码
计算机是通过二进制表示数据的
例如 byte a = 1 (二进制 表示为 0000 0001)
但是这样无法表示负数
所以将第一位 挪用来表示符号 0为正 1为复 第一位不参与运算
byte b = -1 (二进制表示为 1000 0001)
这也是为什么 1 个byte类型的数的范围 只能显示到 -128( 2^7 ) ~ 127( 2^7 - 1) ("为什么不-1 后面讲")
但是对于计算机,加减乘数已经是最基础的运算,计算机辨别"符号位"显然会让计算机的设计变得很复杂
为了让符号位也能参与运算 且不改变结果 于是出现了反码
正数的反码是其本身
负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
例如
-1 = 1000 0001 (原)= 1111 1110 (反)
通过反码计算 1 + (-1)
1 + (-1) = (0000 0001)反+ (1111 1110)反 = (1111 1111)反 "此时得到的还是反码结果"
反码转换成原码 才是人能理解的二进制表示方式
原 1 + (-1) = (1111 1111)反 = (1000 0000)原 = -0
反码从数值上来说已经可以实现 带符号加减了 但是还存在一个问题
0有了两种表现形势 0000 0000 (+0) 1000 0000 (-0)
所以出现了 补码
正数的补码就是其本身;
负数的补码是在反码的基础上+1
1 + (-1) = (0000 0001)反+ (1111 1110)反 = (0000 0001)补 + (1111 1111)补 = (10000 0000)
10000 0000 最多只能存储8位 最高位抛弃 所以结果为 0000 0000 = 0; 补码完美的解决了正负0的问题
但是 -0 (1000 0000) 这个数被拿来表示 -128了 所以 byte 的取值范围 是 -128( 2^7 ) ~ 127( 2^7 - 1)
-128 = - 1 + (- 127) = (11000 0000)补 舍弃高位 = 1000 0000 = -0
本作品采用《CC 协议》,转载必须注明作者和本文链接