黑马程序员技术交流社区

标题: 关于整数类型的问题,听说这是面试题哟! [打印本页]

作者: ankje    时间: 2015-3-4 23:01
标题: 关于整数类型的问题,听说这是面试题哟!
本帖最后由 ankje 于 2015-3-10 23:43 编辑

    编译以下代码时会报错,如果将行 3 的 byte 改成 short 同样会报错,而改成 int 或 long 则 编译通过。我的理解为:java会将两变量的加法运算的和转换成int类型,int再向byte或short转换自然会报错。但事实上到底是不是这个原因呢?各位大虾,你们有不同的理解么?
  1. class Test{
  2.     public static void main(String[] args){
  3.         byte a=3,b=4,c=5;
  4.         a=b+c;//报错
  5.         System.out.println(a);
  6.     }
  7. }
复制代码




作者: sofeel    时间: 2015-3-4 23:15
是这样:你随便写个整数,它默认的就是int. 那题中的3,4,5都是int型。

所以, byte a=3,b=4,c=5;这句话就是错的,怎么能把int装到byte中去呢?装不下。short是一样的道理。
当定义成int时,自然ok的,用int来装int数据很合适。
当定义成long时,太爽了,随便装,怎么都能装下。


作者: 硫氢化铁    时间: 2015-3-4 23:19
第四行写错了,应该改成a=(byte)(b+c);这是转换的问题
作者: 唐泉银    时间: 2015-3-4 23:52
1楼说出了出错的本质
作者: 李忠兵    时间: 2015-3-5 02:34
sofeel 发表于 2015-3-4 23:15
是这样:你随便写个整数,它默认的就是int. 那题中的3,4,5都是int型。

所以, byte a=3,b=4,c=5;这句话 ...

但是byte a=3,b=4,c=5;这句编译可以通过的啊,为什么说它是错的。。。
将一个在byte范围内的常量是可以直接赋给byte变量的啊。
作者: z47057554    时间: 2015-3-5 03:11
李忠兵 发表于 2015-3-5 02:34
但是byte a=3,b=4,c=5;这句编译可以通过的啊,为什么说它是错的。。。
将一个在byte范围内的常量是可以直 ...

byte在初始化的时候会自动强转的,
byte b=4; 是可以的
赋值不会强转的
byte b;
b=4;
你这样写肯定会错的
作者: huangchunwei    时间: 2015-3-5 08:00
初始化a,b,c没有错误。再去对a,b,c进行算数运算就会牵涉到自动装箱的问题。既b+c会自动提升为int类型,这样你在赋值给a(a是byte类型),所以这里会报错,只要强转一下就OK了。
作者: 执念    时间: 2015-3-5 08:38
我在加一点、强制转换是【高精度转低精度】才使用的(高--->低:long  int   short  byte ,(浮点型)double  float)
自动转换、是低精度转换为高精度  ,自动类型提升
作者: fantacyleo    时间: 2015-3-5 13:18
李忠兵 发表于 2015-3-5 02:34
但是byte a=3,b=4,c=5;这句编译可以通过的啊,为什么说它是错的。。。
将一个在byte范围内的常量是可以直 ...

http://bbs.itheima.com/thread-127149-1-1.html
作者: ankje    时间: 2015-3-5 21:55
z47057554 发表于 2015-3-5 03:11
byte在初始化的时候会自动强转的,
byte b=4; 是可以的
赋值不会强转的

经过测试,
byte b;
b=4;
并没有提示错误。
作者: ankje    时间: 2015-3-5 21:58
硫氢化铁 发表于 2015-3-4 23:19
第四行写错了,应该改成a=(byte)(b+c);这是转换的问题

是的,正如我所理解,java会把它变为 a=(int)(a+c) ,若按你所说的对做就不会报错了
作者: 硫氢化铁    时间: 2015-3-5 22:57
ankje 发表于 2015-3-5 21:58
是的,正如我所理解,java会把它变为 a=(int)(a+c) ,若按你所说的对做就不会报错了 ...

嗯,理解就好
作者: ㏒假™面具    时间: 2015-3-6 03:14
1.第一句话是对的。 照1楼那样说就没办法定义byte型变量了。
2.基本数据类变量进行运算时,会先将byte,short,char型变量默认提升为int类型,
a = b+c;其中b+c运算出来的结果时int型,所以会报错。
作者: z47057554    时间: 2015-3-6 03:52
ankje 发表于 2015-3-5 21:55
经过测试,
byte b;
b=4;

确实是这样,b=-128~127是不会报错的,这个跟自动装箱的享元设计模式类似
作者: qq10763582    时间: 2015-3-6 07:07
好多大事神
作者: 路文龙    时间: 2015-3-6 10:39
来学习一下。
作者: 夏季熬成了秋    时间: 2015-3-6 12:09
综合学习了。
作者: zfgrinm    时间: 2015-3-6 13:27
李忠兵 发表于 2015-3-5 02:34
但是byte a=3,b=4,c=5;这句编译可以通过的啊,为什么说它是错的。。。
将一个在byte范围内的常量是可以直 ...

因为你这里写b和c是变量,若是a=3+4则不会出错,因为此时后面的结果是常量
作者: 18234133910    时间: 2015-3-6 14:01
这个问题基础教程里就有啊~~
作者: 勇闯☀☀黑马    时间: 2015-3-6 17:04
你觉得byte 型数据的占1个8位2进制,3是一个整数占4个8位二进制,你拿1俩的碗装4俩的饭能装下吗。
作者: 长工射日    时间: 2015-3-6 17:18
java好像有自动给变量定义类型的功能,你不定义,它就自动定义为int型
作者: sofeel    时间: 2015-3-6 21:06
李忠兵 发表于 2015-3-5 02:34
但是byte a=3,b=4,c=5;这句编译可以通过的啊,为什么说它是错的。。。
将一个在byte范围内的常量是可以直 ...

楼下的哥们说的全面。
平时的书写一定要规范。
即使编译没报错,但它的语义也是不准确的。
对自己要求要严格嘛
作者: sofeel    时间: 2015-3-6 21:14
z47057554 发表于 2015-3-6 03:52
确实是这样,b=-128~127是不会报错的,这个跟自动装箱的享元设计模式类似

那这是一个特殊事件,当常识记住了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2