有符号数,左边第一位是符号位,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 |
本文详细介绍了有符号数在计算机中的表示方式,特别是Java中如何进行原码、反码和补码的转换。通过具体的例子展示了正数、负数和0在不同编码下的变化,并提供了Java代码实现这些转换。理解这些概念对于深入理解计算机底层的数值处理至关重要。
1741





