计算机中的源码、反码、补码。
首先,我们先看一段代码:
public class TestDemo02 { public static void main(String[] args) { int num1 = 4; int num2 = -4; System.out.println(Integer.toBinaryString(num1)); System.out.println(Integer.toBinaryString(num2)); } }
这段代码是要打印num1和num2的二进制表示,我们看下结果:

4很理解,100 = 1*2^2+0*2^1+0*2^0=4,但是-4 为什么是11111111111111111111111111111100来表示??
这里,我们就需要了解计算机中数据是如何存储的。
一、基本定义
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以用补码统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
- 原码:二进制表示。二进制首位是符号位,0为正,1为负
- 反码:正数,反码和原码一样;负数,符号位不变,其他各位取反
- 补码:正数,补码和原码一样;负数,反码末位加1,有进位则进位,但不改变符号
按照这个定义,我们看下-4是怎么表示的。
-4的原码,符号位为1表示负数
10000000 00000000 00000000 00000100
-4的反码,符号位不变,其他各位取反
11111111 11111111 11111111 11111011
-4的补码,反码的末位加1,符号位不变
11111111 11111111 11111111 11111100
所以,我们看到跟java 运行输出的结果是一致的。
二、负数的位运算
正数的原码、反码、补码都一样,直接运算即可,负数的位运算需要转换成补码运算后再转成原码。
例如:
-4<<2
① -4的原码,符号位为1表示负数
10000000 00000000 00000000 00000100
② -4的反码,符号位不变,其他各位取反
11111111 11111111 11111111 11111011
③ -4的补码,反码的末位加1,符号位不变
11111111 11111111 11111111 11111100
④对补码进行左移两位(最高位不变,次高两位去掉,末尾两位补0)
11111111 11111111 11111111 11110000
⑤取反码,-1
11111111 11111111 11111111 11101111
⑥原码,最高位不变,其他位去反
10000000 00000000 00000000 00010000
换算成十进制就是-16.
我们用程序验证下:
public class TestDemo02 { public static void main(String[] args) { int num2 = -4; System.out.println(num2<<2); } }
输出结果:

因此,总结下,涉及到负数的位运算,计算过程:

扩展阅读:为什么需要反码?
https://blog.csdn.net/chenchao2017/article/details/79733278

浙公网安备 33010602011771号