重温java数据类型与移位运算符

       java数据类型一共分为四大类:boolean、整数类、浮点类、字符类。如下图:

第一类:逻辑型boolean

       boolean类型数据只允许取值true或false,与c语言不同的是,它不可以用整数0或非0整数取代true和false。

       关于boolean类型的变量在jvm中占多少字节,在java规范中并没有给出精确的定义。但在《Java虚拟机规范》一书中是这样描述的:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。因此,我们可以得出boolean类型单独使用是4个字节,在数组中又是1个字节。

第二类:文本型char

       字符常量为用单引号括起来的单个字符,例如:

char eChar='a';

char cChar='中';

java中,char类型的采用unicode编码,每个字符占两个字节。

第三类: 整数型(byteshortintlong)

       每种整数型占用的存储空间和表示范围如下:

类型

存储空间

表示范围

byte

1字节

-128--127

short

2字节

-2^15(-32768)--2^15-1(32767)

int

4字节

-2^31(-2147483648)--2^31-1(2147483647)

long

8字节

-2^63--2^63-1

java的整型常量默认为int型,声明long类型的常量可以后加“l”或“L,如:

int i=600;//正确

long lo=555L;//必须加L否则会出错

值得一提的是,short常量可以直接声明,例如short=3;

但是,不管声名哪种类型的常量,常量值都不超出它能表示的范围,例如:

short s1=5;//正确

short s2=32769;//错误,超出了-2^15(-32768)--2^15-1(32767)范围

int i=2147;//正确

int i=2147483649;//错误,超出了-2^31(-2147483648)--2^31-1(2147483647)范围

第四类:浮点型(floatdouble)

       在数学中0到1有无数个浮点数;而计算机是离散的,所以表示的时候有误差,计算机用精度(小数点后几位来表示正确),比较浮点数时a==0.1是不合适的,应该a-0.1==0;如果a是0.1,则即使有误差 a-0.1==0因为a和0.1都被表示为一个有误差的计算机二进制。

       每种浮点数型占用的存储空间和表示范围如下:

类型

存储空间

表示范围

float

4字节

-3.403E38--3.403E38

double

8字节

-1.798E308--1.798E308

       java浮点型常量默认为double类型,如果要声明一个常为float型,后面加f或F,如:

double d=123.6//正确

float f=13.5f;//必须加f,否则会出错

java移位运算符:

       java运算符具体有哪些,以及各自优先级,这里先不详解,而只选择比较复杂的移位运算符进行详解和总则。移动运算符包括左移运算符(<<)、右移运算符(>>)、无符号右移(>>>)三个。

       计算机中用补码表示数据,所以在进行移位操作时,也是将补码按位移动。

1、左移运算符(<<

 左移运算符<<使指定值的所有位都左移规定的次数。

它的通用格式如下所示:

  value << num

  num 指定要移位值value 移动的位数。

左移的规则只记住一点:丢弃最高位,0补最低位

  如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了332=1位。

左移运算符运算规则

  按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。

  当左移的运算数是byte short类型时,将自动把这些类型扩大为 int 型。

       在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以21次方,左移n位就相当于乘以2的n次方。

举个栗子:

数据 127,补码和原码一样:0111 1111。

左移一位:1111 1110-> 补码对应的原码为:1000 0010 对应十进制:-2

左移二位:1111 1100-> 补码对应的原码为:1000 0100 对应十进制:-4

左移三位:1111 1000-> 补码对应的原码为:1000 1000 对应十进制:-8

左移四位:1111 0000-> 补码对应的原码为:1001 0000 对应十进制:-16

左移五位:1110 0000 -> 补码对应的原码为:1010 0000 对应十进制:-32

左移六位:1100 0000 -> 补码对应的原码为:1100 0000 对应十进制:-64

左移七位:1000 0000-> 补码对应的原码为:1000 0000 对应十进制:-128

左移八位:0000 0000-> 补码对应的原码为:0000 0000 对应十进制:0

2、右移运算符(>>

它的通用格式如下所示:

value >> num

num 指定要移位值value 移动的位数。

右移的规则只记住一点:符号位不变,左边补上符号位

运算规则:

按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1

当右移的运算数是byte short类型时,将自动把这些类型扩大为 int 型。

右移一位相当于除2,右移n位相当于除以2n次方。

3、无符号右移运算符(>>>

它的通用格式如下所示:

value >>> num

num 指定要移位值value 移动的位数。

无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位

无符号右移规则和右移运算是一样的,只是填充时不管左边最高位的数字是正是负,都用0来填充,无符号右移运算只针对负数计算,因为对于正数来说这种运算没有意义。

无符号右移运算符>>> 只是对32位和64位的值有意义

举例对比>>>>>

-5用二进制补码表示1111 1011,红色为该数符号位

-5>>2:1111 1011-------------->1111 1110,11为标志位

-5>>>2:1111 1011-------------->0011 1110,00为补充的0

上文中粗体字体或红色字体的内容为重点了解或者记忆的内容,更多信息,请用微信扫码关注本人公众号

 

转载于:https://my.oschina.net/u/1415710/blog/1490752

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值