java编程数据溢出问题,java中数据溢出处置

java中8中基本数据类型,每种数据类型都有不同容量。当大容量数据类型向小容量数据类型进行强制类型转换时可能出现数据溢出。首先先总结一下,java中基本数据类型所在内存大小和能表示的数据范围。

基本类型

位数

范围

默认值

byte(字节)

8

-128 至 127

0

shot(短整型)

16

-32768 至 32767

0

int(整型)

32

-2147483648至2147483647

0

long(长整型)

64

-2^63至2^63-1

0L或0l

boolean

1

0,1或true,false

false

char

8

\u0000至\uffff

\u0000

flaot

double

每种基本数据类型在java中都有相应的包装类,其中记录相对应基本数据类型的最大值和最小值,并提供了一些方便数据类型转换的接口。

当数据类型进行强制类型转换时,超出了数据表示范围就会出现数据溢出。比如:

int i = 703;

byte b = (byte)i;

System.out.println(b);

打印结果为-65  。之前没有研究过,自以为猜测打印结果应该是127.

正确的解析过程应该是,222二进制表示应该是1010111111(由于i是int32位,所以前面应该很多个0凑集32位),但是byte只有8位容量,最终b=10111111(最左边的两位10被截取了)。 10111111直接转换成十进制是191,并不是-65  .那这个65  又是怎么得到的呢?

计算机的最高为是符号位,0表示正数,1表示负数。当为负数时,转换成十进制需要遵循这样一个规则。

1、首先按位取反,最高位符号位不需要转,10111111->11000000

2、再加1.  为11000001

3、最高位1表示-,1000001转换为十进制为65.所以最终结果为-65

所以当int类型向short、byte类型强制类型转换时出现一些莫名其妙的值时,都可以运用以上的规则进行解析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值