java中的byte k = i+j;其中i,j为int类型

大佬同学问了我一个Java基础问题,我第一反应就是这不就是9吗,结果她告诉我代码是无法运行的。

	byte i =7;
	byte j =2 ;
	byte k = i+j;
	System.out.println(k);

我不服,我把代码粘到IDE里,发现竟然报错。
在这里插入图片描述
好吧,现在我服了

IDEA提示需要byte类型而实际上=号右边是int类型,int的范围是要比byte大的,所以直接用是行不通的(原因在后面),必须强制类型转换。
所以我就好奇为啥两个byte类型的变量用+后就变成int类型。

最后,我发现当时正在看的书上就有相关介绍

两个数值进行二元操作时,结果有可能会自动转换类型,分为4中情况:

1.如果两个操作数中有一个是double类型,另一个就会转换为double类型。

比如这段代码

	double i =7;
	byte j =2 ;
	Object k = i+j;
	System.out.println("Vaule of k is; "+k+". \nThe type of k is "+k.getClass().toString());

它的运行结果为

Vaule of k is; 9.0. 
The type of k is class java.lang.Double

2.否则,如果其中一个操作数是float,另一个操作数就会转换为float类型。

比如这段代码

	float i =7;
	byte j =2 ;
	Object k = i+j;
	System.out.println("Vaule of k is; "+k+". \nThe type of k is "+k.getClass().toString());

它的运行结果为

Vaule of k is; 9.0. 
The type of k is class java.lang.Float

3.否则,如果其中一个操作数是long,另一个操作数就会转换为long类型。

比如这段代码

	long i =7;
	byte j =2 ;
	Object k = i+j;
	System.out.println("Vaule of k is; "+k+". \nThe type of k is "+k.getClass().toString());

它的运行结果为

Vaule of k is; 9. 
The type of k is class java.lang.Long

4.否则,两个操作数都将被转换为int类型。

比如这段代码

	byte i =7;
	byte j =2 ;
	Object k = i+j;
	System.out.println("Vaule of k is; "+k+". \nThe type of k is "+k.getClass().toString());

它的运行结果为

Vaule of k is; 9. 
The type of k is class java.lang.Integer

现在说是为什么byte类型不能直接转换成int类型,
众所周知,他们两个的大小和取值范围是不同的:

intbyte
4字节1字节
-2147483648~2147483647-128~127

所以把一个范围大的类型转换成范围小的类型必然是不够可靠的,因为这可能会丢失信息。
比如,可以运行这个代码:

	int i = 666;
	byte x = (byte) i;
	System.out.println(x);

这段代码的运行结果是

-102

这个结果很好的证明了上面可能会丢失信息的观点。

至于为何会是这样的结果,不妨将int类型的666转换为二进制

‭0010 1001 1010‬

而byte是只有1字节8位的,所以上面的x只有

1001 1010‬

做高位是1,所以这是个负数,取反加1得

0110 0110

因此,x的值为

-102
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值