有符号数,左边第一位是符号位,0为正,1为负。在java中都是有符号数。
##.转换关系
原码:最左侧为符号位,用剩余数位来表示绝对值;
反码:正数和0,反码为其本身;
负数的反码,符号位不变,其余各位数字取反(0变1,1变0)。
补码:正数和0,补码为其本身;
负数的补码,在反码基础上,不考虑符号位,最末一位加1。
##.java代码中转化
代码中可用位运算,原码转反码,以int值为例,若a为负整数,则a的反码为:
int b = a ^ Integer.MAX_VALUE;
或 int b = -(~a);
注:java中位运算,会对符号位也做运算。
补码为:b = b-1; //因为b是负数,所以最后一位加1,在真值上等同于减1.
真值:有符号数,不考虑符号位,剩余数位所组成数字的值,等于真值的绝对值
以java中byte类型正数为例:
十进制 | 原码 | 反码 | 补码 |
1 | 0000 0001 | 0000 0001 | 0000 0001 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
0 | 0000 0000 | 0000 0000 | 0000 0000 |
-128(Byte最小值) | 1000 0000 | 1111 1111 | 1000 0000 |
127(Byte最大值) | 0111 1111 | 0111 1111 | 0111 1111 |