补码 原码 反码

最近开始在学习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 +-11 +-1=0000 0001)反+1111 1110)=1111 1111)反  "此时得到的还是反码结果"
     反码转换成原码 才是人能理解的二进制表示方式 
     原 1 +-1=1111 1111)反 =1000 0000)原 = -0
     反码从数值上来说已经可以实现 带符号加减了 但是还存在一个问题
     0有了两种表现形势  0000 0000+01000 0000-0)
    所以出现了 补码 
    正数的补码就是其本身;
    负数的补码是在反码的基础上+1
    1 +-1=0000 0001)反+1111 1110)=0000 0001)补 +1111 1111)补 =10000 0000)
    10000 0000  最多只能存储8位  最高位抛弃  所以结果为 0000 0000 = 0; 补码完美的解决了正负0的问题
    但是 -01000 0000) 这个数被拿来表示 -128了 所以  byte 的取值范围 是  -128( 2^7 )  ~ 127( 2^7 - 1)
     -128 = - 1 +- 127=11000 0000)补 舍弃高位 = 1000 0000 = -0
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!