整数数据类型表示范围与位运算

前言

本文仅讨论Java中整数数据类型byte、short、int、long,boolean、char、float、double不在讨论之列。因为浮点数极少用到位运算,boolean类型极少用来进行数值运算,char一般用来操作字符,很少用来参与数值运算,而且可以使用short代替。

1、基本数据类型表示范围

http://xixian.iteye.com/blog/1117432

2、数据类型转换

在Java中这几种基本数据采用补码的形式表示,因此第一个比特均为符号位。而且没有无符号数。

当进行byte -> short -> int -> long转换时,会自动进行字节扩展,并且在高位补上符号位所对应的数。(补码)

如:10001110(byte) -> 11111111 10001110(short)

这样做的好处是在进行正常的向上转换发生时,数本身大小不会被改变,符号也不会发生改变。

当进行long ->int -> short ->byte转换时,会自动去掉高位字节,因此如果原来的数超过了转换后的类型的范围,那么数据的部分信息就会丢失。

而如果在这个范围内,那么转换后数本身不会发生任何变化。

3、位运算

Java没有提供无符号数。但是在进行位运算时我们常常忽略符号位。比如byte类型,我们常常认为8位都是数据,可以表示0~256而不是-128~127。

如果定义了一个数:

byte b = 0xff;

如果这个数为正数或0,这不会出任何问题,因为正数的补码还是自身。

但是就像上面的b一样,我们也许是想表示它为256,即我们认为它是原码的表示形式。但是计算机或者说我们的JVM不这么认为,0xff将被认作补码,

因此这个数将被认作-1(如果我们将它转成int输出的时候)。

在这种情况下,如果我们想保持它的值,那么直接使用强制类型转换就难以胜任了。为此我们可以使用位运算来解决这个问题。

int r = b & 0xff;

使用上面这条语句,那么低字节上的数将被保留,而高字节被置零而不是符号位1。这意味着这个负数被我们强制转成了我们和计算机都认可的整数。


尾声

位运算本身代码不难,难点在于是否可以想清楚其中的逻辑关系。可以先用笔在纸上简单计算一下,在转换成代码,事半功倍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值