--- title: Java SE笔记: 原码反码补码 date: 2016-07-13 21:10:00 updated: 2016-07-13 21:10:00 description: "计算机中的符号数有三种表示方法,即原码、反码和补码。" categories: [个人笔记] tags: [Java, Java SE笔记] --- 计算机中的符号数有三种表示方法,即原码、反码和补码。 三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。 `在计算机系统中,数值一律用补码来表示和存储。` 原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。 此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。 正数的原码、反码、补码都相同。 - 原码:就是二进制表示,最高位为符号位,0表示正,1表示负 - 反码:负数的反码,就是逐位取反(符号位除外) - 补码:负数的补码,反码末位加1. 正数5: ``` 二进制:00000101 原码:00000101 反码:00000101 补码:00000101 ``` 负数5: ``` 二进制:10000101 原码:10000101 反码:11111010 补码:11111011 ``` 计算: 2-1 ``` 2-1 = 2 + (-1) 2 000000100000001000000010 -1 100000011111111011111111 负数的补码求原始数据步骤:1. -12. 取反3. 符号位改为1 1111111111111110 2 00000010 -1 11111111 00000001 ``` 计算:2-3 = 2 + (-3) = -1 ``` 2 000000100000001000000010 -3100000111111110011111101 2 00000010-3 11111101 11111111 ``` > **-128是人为规定的。** > 因为8位2进制中,存在 “-0”(1000 0000)和"0"(0000 0000),虽然“-0”也是“0”,但根据正、反、补码体系,“-0”的补码和“+0”是不同的,这样就出现两个补码代表一个数值的情况。为了将补码与数字一一对应,所以人为规定“0”一律用“+0”代表。同时为了充分利用资源,就将原来本应该表示“-0”的补码规定为代表-128。 > **验证 1000 0000 到底是0还是-128,先假设为X** > 则 2+X=? > 0000 0010 > 1000 0000 > 1000 0010 --> 1000 0001 --> 0111 1110 > 即为正负126 > 所以X=-128或X=124,显然应该取负数解!