A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© SutMaceZo 高级黑马   /  2016-8-6 22:44  /  940 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


Android基础班第二天讲的问题
------------------------------------------------------------------------
面试题:看下面的程序是否有问题,如果有问题,请指出并说明理由。
        * byte b1 = 3;
        * byte b2 = 4;
        * byte b3 = b1 + b2;
        byte b3=3 + 4;
* 从两方面去回答这个题
                * b1和b2是两个变量,变量里面存储的值都是变化的,所以在程序运行中JVM是无法判断里面具体的值
                * byte类型的变量在进行运算的时候,会自动类型提升为int类型
--------------------------------------------------------------------------------
问题来了,若是将byte换成int或者long,程序是可以运行的,但是按照上面的说法,b1和b2还是两个变量啊,‘’变量里面存储的值都是变化的,所以在程序运行中JVM是无法判断里面具体的值‘’,这句话是不是不对啊

6 个回复

正序浏览
牧风 发表于 2016-8-6 23:36
这个不是看变量的 是看底层运算 byte 两个字节 b1  00000000 00000011  b2 00000000   00000100
因为正数  ...

解释的太棒了
回复 使用道具 举报
SutMaceZo 发表于 2016-8-7 00:16
所以说,和是否为变量无关呗?

正因为b1+b2是变量相加 他才会报错 变量byte 型b1+b2 的时候会自动转换成int   这时候他们的结果是一个int型变量 你要讲这个int 型变量 赋值给 byte 型的b3 他就会报错  不知道懂了吗
回复 使用道具 举报
* byte b1 = 3;         * byte b2 = 4;         * byte b3 = b1 + b2;   //这句话是错误滴 他会自动转换成int类型 运算所以要(int)(b1+b2)      byte b3=3 + 4;
回复 使用道具 举报
问题一:* b1和b2是两个变量,变量里面存储的值都是变化的,所以在程序运行中JVM是无法判断里面具体的值

答:b1和b2确实是你定义的两个变量,但他们的初始化值并不是变量,而是常量。所以JVM是知道b1跟b2里值的,也知道赋值后并没有超出byte范围。如果是byte b1 = b2;这个初始化值是变量,JVM识别不了。

问题二:* byte类型的变量在进行运算的时候,会自动类型提升为int类型

答:确实,这里在第三行代码的时候会提升为int类型,然后赋值给byte类型。
问题就出在第三行,b1+b2运算时提升为int了 ,结果也算出来了。在往byte b3里赋值的时候,因为int比byte大,就会提示容易损失精度,想硬往里赋值用强制转换就好。byte b3 = (byte)b1 + b2;

最后:‘’变量里面存储的值都是变化的,所以在程序运行中JVM是无法判断里面具体的值‘’,这句话是不是不对啊

如果给变量赋的值是常量,JVM是知道里面值的,计算机不可能连1、2、3也认不出来不是?
你如果赋个int y = b; 那么代码是一行行运行的,只有你在调用这个变量的时候,计算机才会去调用b里面的数值。这时候才确定这个变量里面的值是多少。只是赋值不调用,JVM并不运算里面的值是什么。
回复 使用道具 举报
牧风 发表于 2016-8-6 23:36
这个不是看变量的 是看底层运算 byte 两个字节 b1  00000000 00000011  b2 00000000   00000100
因为正数  ...

所以说,和是否为变量无关呗?
回复 使用道具 举报
这个不是看变量的 是看底层运算 byte 两个字节 b1  00000000 00000011  b2 00000000   00000100
因为正数 原码 反码补码 都相同 所以  如果 b1+b2  是变量操作 就自动转成int 型
b1  00000000  00000000  00000000 00000011  b2  00000000  00000000  00000000  00000100
b1+b2   但是 b3 是byte 类型 他要从 int 四个字节转成 2 个字节  删除8个字节 00000000  00000111  
这样 如果 前面两排 8个字节中如果有1 那么不就容易丢失精度吗? 对吧 不知道你懂了没
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马