Java基本数据类型与位运算、原码&补码&反码

来源:互联网 发布:斗鱼直播for mac 编辑:程序博客网 时间:2024/05/22 17:21

一、Java中的基本数据类型

平日里开发过程中,总是会遇到基本数据类型在内存中占几个字节的类似疑问,一直想把这些基础的知识整理一下,总是偷懒,于是今天便总结了一下,如果下面的文章哪里有问题,欢迎在评论中留言指出:
Java中有8种基本数据类型,分别是byte,short,int,long,char,float,double,boolean型数据,其在内存中占据字节数,取值范围如图:

类型 存储需求 bit位数 取值范围 byte 1个字节 1*8 -128~127(-2的7次方到2的7次方-1) short 2个字节 2*8 -32768~32767(-2的15次方到2的15次方-1) int 4个字节 4*8 -2的31次方到2的31次方-1 long 8个字节 8*8 -2的63次方到2的63次方-1 char 2个字节 2*8 0~65535(Character.MIN_VALUE~Character.MAX_VALUE) float 4个字节 4*8 Float.MIN_VALUE~Float.MAX_VALUE double 8个字节 8*8 Double.MIN_VALUE~Double.MAX_VALUE boolean 1个字节 1*8 false或者true

这里针对char、float与double类型的取值范围还要补充一下:
①Character.MIN_VALUE = ’ \u0000’; Character.MAX_VALUE = ‘\uFFFF’;而在Java中\u开头的是一个Unicode码的字符,Unicode字符通常用十六进制编码方案表示,范围在’\u0000’到’\uFFFF’之间。\u0000代表的应该是NULL,输出控制台是一个空格。而具体关于Java中Unicode的理解请参考Java中Unicode的编码和实现

②Float.MIN_VALUE = 1.4E-45(2^(-149));
Float.MAX_VALUE = 3.4028235E38((2-2^(-23))*2^127 );数值后面一般有一个F或者f,比如3.1435f
Double.MIN_VALUE = 4.9E-324;
Double.MAX_VALUE = 1.7976931348623157E308;数值后面什么都不标,默认是double类型的;
具体解释请参阅Java中float/double取值范围与精度
关于java中浮点数据的研究,请参阅基础野:细说浮点数

二、Java中的原码&反码&原码
计算机中的数据都是以二进制流的方式来存储,整数的表达:
原码:第一位为符号位(0为正数,1为负数)
反码:符号位不动,原码取反。
负数补码:符号位不动,反码加一。
正数补码:和原码相同。
比如我们用byte类型的5、-1、-6、0来举例:
5的原码:00000101
5的反码:01111010
5的补码:00000101
负数的表示:
-1的原码:10000001 -6的原码:10000110
-1的反码:11111110 -6的反码:11111001
-1的补码:11111111 -6的补码:11111010
0的表示:
0的原码:00000000 负数0的原码:10000000
0的反码:01111111 负数0的反码:11111111
0的补码:00000000 负数0的补码:00000000

在计算机系统中,数值一律用补码来表示和存储。原因如下:

  1. 使用补码,可以将符号位和数值域统一处理
  2. 加法和减法也可以统一处理
  3. 原码与补码相互转换,其运算过程是相同的,不需要额外的硬件电路。

同时补码的特性:

  • 一个负整数(或原码)与其补数(或补码)相加,和为模。
  • 对一个整数的补码再求补码,等于该整数自身。
  • 补码的正零与负零表示方法相同。

三、Java中的左移、右移、无符号右移

  • 左移:<<,有符号的移位操作,左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用0补充。
  • 右移:>>,有符号的移位操作,右移操作时将运算数的二进制码整体右移指定位数,右移之后的空位用符号位补充,如果是整数用0补充,负数用1补充;
  • 无符号右移:>>>,无符号的移位操作,无符号右移操作时将运算数的二进制码整体右移指定位数,右移之后的空位用0补充。

比如3<<2,byte类型的数字3转化为二进制,0000-0011,向左移两位,最右边两位用0补齐,其结果为12;相当于3*2^2,就是乘以2的移动的位数次幂。
3<<2移动之前: 0000-0011
3<<2移动过程:0000-001100,后面的两位补0
3<<2移动之后: 0000-1100

例:6>>2,byte类型的数字6转化为二进制00000110,向右移动两位,最左边空出的两位,用0补齐,结果为1,相当于6/4,只取整数,舍弃小数;就是除以2的移动的位数次幂。
6>>2移动之前:0000-0110
6>>2移动过程:0000-000110
6>>2移动之后:0000-0001

例:-6>>2,byte类型的数字-6转化为二进制10000110,向右移动两位,最左边空出的两位,用1补齐,结果为-2;这里注意,负数在右移的过程中,首先要转化为补码
-6>>2移动之前:1000-0110,求其补码:11111010
-6>>2移动过程: 1111-111010
-6>>2移动之后:1111-1110,负数的补码求原码1000-0010

例:-6>>>2,因为6>>>2移位的过程与6>>2相似,这里不再做过多描述,byte类型的数字-6转化为二进制10000110,当-6无符号向右移动两位,首先转化为其补码,最左边空出的两位,用0补齐;然后在转化为原码,其结果为00111110;
-6>>>2移动之前:1000-0110,求其补码:11111010
-6>>>2移动过程: 0011-111010
-6>>>2移动之后:0011-1110,其为正数,即为原码

0 0
原创粉丝点击