Java数据类型转换问题

一、问题一

  • 请看如下代码,想想看编译和运行有没有问题?
    public class Demo{
    	public static void main(String[] args){
    		byte a = 1;
    		byte b = 2;
    		byte c;
    		c = 3 + 4;
    	}
    }

    编译结果:

    编译和运行都没有问题,输出7

  • 我们再来看另一段程序

    public class Demo{
    	public static void main(String[] args){
    		byte a = 1;
    		byte b = 2;
    		byte c;
    		c = a + b;
    		System.out.println("c = "+c);
    	}
    }

    编译结果:

    这是为什么呢?为什么c = a + b会报错呢?
    按照我们正常的理解,将byte类型的a和b想加,再赋值给同样是byte类型的c,而且最后结果还没有超出byte范围,应该是没问题的。

  • 请看箭头所指的两个数据类型,从int转换到byte可能会有损失。这说明了 a + b 是一个int类型,这是因为变量想加,首先要看类型,Java中整数的默认类型为int,所以变量在进行运算的时候,先将变量a和b想上提升为int类型的变量,他们想加的结果也是int类型,将int类型赋值给byte类型会丢失数据,所以编译报错。

  • 那么为什么c = 3 + 4编译成功了呢?
    因为3和4都是常量,常量运算的时候先进行运算,最后将结果赋值给byte类型,如果没有超过byte类型的范围,那么就不报错。否则就会报错。请看如下代码:

    public class Demo{
    	public static void main(String[] args){
    		byte c;
    		c = 127 + 1;
    		System.out.println("c = "+c);
    	}
    }

    编译结果:

    同样编译报错,因为byte数据类型的范围在-128-127,而127 + 1的运算结果为128,不在范围其范围内,所以报错。

二、问题二

  • 下面代码编译会报错,原因在上面已经解释。如果我就是想赋值那么该怎么办呢?输出的结果又是多少呢?
    class Demo {
    	public static void main(String[] args) {
    		byte a = 130;
    		System.out.println(a);
    	}
    }

     

  • 使用强制类型转换赋值
    代码如下:

    class Demo {
    	public static void main(String[] args) {
    		byte a = (byte) 130;
    		System.out.println(a);
    	}
    }

    运行结果:

    结果为什么是-126呢?下面我将用一张图来给大家解释

    关于原码、反码和补码的相关内容在此不做过多的阐述。
    图画的不是很好,但是应该可以看的懂,请各位大佬见谅!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值