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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© SutMaceZo 高级黑马   /  2016-8-6 22:44  /  883 人查看  /  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 个回复

倒序浏览
这个不是看变量的 是看底层运算 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 那么不就容易丢失精度吗? 对吧 不知道你懂了没
回复 使用道具 举报
牧风 发表于 2016-8-6 23:36
这个不是看变量的 是看底层运算 byte 两个字节 b1  00000000 00000011  b2 00000000   00000100
因为正数  ...

所以说,和是否为变量无关呗?
回复 使用道具 举报
问题一:* 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并不运算里面的值是什么。
回复 使用道具 举报
* byte b1 = 3;         * byte b2 = 4;         * byte b3 = b1 + b2;   //这句话是错误滴 他会自动转换成int类型 运算所以要(int)(b1+b2)      byte b3=3 + 4;
回复 使用道具 举报
SutMaceZo 发表于 2016-8-7 00:16
所以说,和是否为变量无关呗?

正因为b1+b2是变量相加 他才会报错 变量byte 型b1+b2 的时候会自动转换成int   这时候他们的结果是一个int型变量 你要讲这个int 型变量 赋值给 byte 型的b3 他就会报错  不知道懂了吗
回复 使用道具 举报
牧风 发表于 2016-8-6 23:36
这个不是看变量的 是看底层运算 byte 两个字节 b1  00000000 00000011  b2 00000000   00000100
因为正数  ...

解释的太棒了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马