计算机中的符号数有三种表示方法,即原码、反码和补码
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。
正数
10的原码是 0000 0000 0000 0000 0000 0000 0000 1010
10的反码是 0000 0000 0000 0000 0000 0000 0000 1010
10的补码是 0000 0000 0000 0000 0000 0000 0000 1010 计算机中存储的
负数
-10的原码是 0000 0000 0000 0000 0000 0000 0000 1010
-10的反码是 1111 1111 1111 1111 1111 1111 1111 0101
-10的补码是 1111 1111 1111 1111 1111 1111 1111 0110 计算机中存储的
总结
1.正数的原码与其反码补码相同
2.负数的原码最高位为1
3.负数的反码符号位不变,其余各位按位取反
4.负数的补码在其反码的基础上+1
5.计算机系统中,数值一律用补码来表示和存储
补码转化为原码
已知一个数的补码,求原码的操作其实就是对该补码再求补码:
⑴如果补码的符号位为“0”,表示是一个正数,其原码就是补码。
⑵如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。
已知一个补码为1111 0111,则原码是1000 1001(-9)。
因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。
其余七位111 0111取反后为000 1000;
再加1,所以是1000 1001。
java中输出二进制
package com.cwp.thread;
import static java.lang.System.out;
public class Demo {
final static char[] digits = { '0', '1' };
// 改造的
public static String intToBinaryString(int i) {
char[] buf = new char[32];
int pos = 32;
int mask = 1;
do {
buf[--pos] = digits[i & mask];
i >>>= 1;
} while (pos > 0);
return new String(buf, pos, 32);
}
public static void main(String[] args) {
out.println(Integer.toBinaryString(2147483647));
out.println(Long.toBinaryString(2147483648L));
out.println(intToBinaryString(10));
}
}