Java位移符 反码 补码
前言
你好,你是否曾经拥有过一个疑问?
当你打开电脑,绚丽的图片,轻柔的音乐、妙趣的视频簇拥着你时,
你是否思考过,这五彩斑驳的计算机世界到底是由何组成?
答案是 0和1。此刻你所看到的一切底层都是0和1组成,即二进制表示。
那么今天我将为大家介绍的是数字在计算机中的表示。
计算机补码
计算机的底层是由二进制实现的,如需要存储数字。首先要分配固定空间,然后以补码形式存储。
计算机补码分为符合位与绝对值位。
符号位:所分配空间最高位。如一个字节的空间,最高位即为从右到左第八位。
绝对值位:当前空间中除开符号位剩下的位置。
一、原码、反码、补码
- 原码:计算机表达数字代码(我们所理解的二进制码),如一个八位的空间,0000 0101,十进制的5
- 反码:正数的反码与补码都是它本身,而负数的反码是除去符号位其他位方取反,如 10001001的反码为:1111 0110
- 补码:正数的反码与补码都是它本身,负数的补码为反码加一,即 1000 1001的补码为 1111 0111
计算机存储数字时,需要经过以上运算,以补码形式进行存储。
二、取出并显示
这是关键,当一个计算机源码被提取并要求显示在屏幕上(即变为我们所理解的十进制)。首先会进行符号位的判断:
- 当符号位为正(0)按照我们常见的流程,二进制转换为十进制;
- 当这个符号位为负(1)时,先-1(变为反码),再取反(变为原码)。再保留符号位,将其转换为十进制
-1 补码为 1111 1111 减一 为 1111 1110 取反后为 1000 0001 转换为十进制为 -1
三、java 位移符
位移符用于控制在计算机内部源码(二进制)的移动,而位移符又分为三种:
下面演示内容,分配空间均为1字节(8位),即:1位符号位+7位绝对值。
1. >> 带符号位移
向右移动,最高位补充当前符号位(1或0)
例如 4 >> 2 4的补码为0000 0100 带符号右移两位 0000 0001
System.out.println(4 >> 2);// 1
2. << 带符号左移
向右移动,最低位补0。
例如 4 << 2 4的补码为0000 0100 带符号右移两位 0001 0000
System.out.println(4 << 2); // 16
3. >>> 带符号右移
向右移动,最高位补0
如 -1 >> 1 为多少? 0 ?错,仔细看看下面。
我们知道数字在计算机里是以补码的形式存储的,所以 -1 在计算机中的源码为:1111 1111
当它右移,最高位补0,则为 0111 1111,则为 -127。
System.out.println(-1 >>> 1);// 2147483647
那为什么上面代码输出这么大的数勒? 因为Java中默认整形(int)存储空间为32位。
即-1 的补码 为 1111 1111 1111 1111 1111 1111 1111 1111
大家可以尝试用我刚才的方法,推出为什么执行后的数字辣么大!
规律:当一个数字当它为奇数时,二进制的最低为一定为1。
7 的计算机源码(假设空间为一字节)为:0000 0111
总结
以上就是我今天的内容,本来是打算写两个章节,但是为了阅读方便。我就将补码和反码的概念加了进来。如果你仔细阅读,相信你一定可以将位移法理解透,并对计算机底层有一些了解。