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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

礼礼小跑

中级黑马

  • 黑马币:43

  • 帖子:20

  • 精华:0

最近看视频,视频里讲整数默认为int类型,小数默认为double类型。float b=3.14会编译报错,因为3.14默认为double类型,double类型比float类型位数高,高位不能自动转为低位。short a=2,2不是默认为int类型么,为何这个可以编译?求大神解答

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

38 个回复

倒序浏览
因为2在short型的表示范围内吧,所以自动转换了

点评

3.14也在float范围内啊  发表于 2015-1-27 22:37
回复 使用道具 举报
同意楼上的回答。。
回复 使用道具 举报
麦兜de篼 发表于 2015-1-27 21:49
因为2在short型的表示范围内吧,所以自动转换了

那么楼主说3.14也在float范围内
回复 使用道具 举报
这是虚拟机的规定,没办法
回复 使用道具 举报
xiaoyi 发表于 2015-1-27 22:01
那么楼主说3.14也在float范围内

浮点数的话,因为后面的小数不确定,所以直接将double型强转成float虚拟机不处理,我是这样理解的

点评

你的意思是,byte a=2有一个强转的过程了?  发表于 2015-1-27 22:40
回复 使用道具 举报
疯狂Java讲义一书中说这是一种特殊情形,如果直接把一个在byte或short类型的表数范围内的整数值赋给一个byte或short变量,系统会自动把这个整数值当成byte或short类型处理~

点评

嗯,理解了。  发表于 2015-1-27 22:45
回复 使用道具 举报 1 0
先说废话:Java基本类型共有八种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。
解释楼主的问题:
1、为什么[size=11.8181819915771px]float b=3.14;错我们首先看编译结果:错误: 可能损失精度。我们知道默认的浮点数是double类型,之所以这样就是为了保证浮点型的精度的完整性,所以这样导致3.14(JVM认为是double)赋值到float时编译出错。正确方法:float c=3.14f;
2、既然上面的都错了,为什么short b = 2;没有报错。我们知道隐性转换一般都是放宽转换(如byte到int,int到long等,都是小的赋给大的。)但是却有一个例外就是,在赋值转换中, 隐性转换也包含了缩窄基本转换。就是从int到byte,char,short的转换:
比如:
byte b=1;//合法
byte b=128; //非法
char和short都是同理的。
右边必须为int型字面常量,而且值必须能被左边类型表示

点评

解释的很到位,又加深了理解!!!  发表于 2015-1-29 16:42
缩窄基本转换,这个解释好。理解了,谢谢!  发表于 2015-1-27 22:43

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报 1 0
麦兜de篼 发表于 2015-1-27 22:11
浮点数的话,因为后面的小数不确定,所以直接将double型强转成float虚拟机不处理,我是这样理解的 ...

是的,把2隐性强转成了short型
回复 使用道具 举报
强制类型转换.
回复 使用道具 举报
大家都说的好好啊,受教了,:lol
回复 使用道具 举报
short或者byte如果参与运算的话就自动提升为int了,比如:byte a=1,b=2;        byte c=a+b;  就会报错
回复 使用道具 举报
可能默认为 double  的内存存储方法与(byte short int long)不同  
回复 使用道具 举报
朋好友 发表于 2015-1-28 00:17
可能默认为 double  的内存存储方法与(byte short int long)不同

Java中直整型赋值时,四种整形只要在承受长度内就会自动截取前面的字节

而由于double folate比较特殊  必须运算转换所以要加吧


这个问题还是问詹姆斯‘高斯林比较好
回复 使用道具 举报
强制类型转换
回复 使用道具 举报
sq_jun 发表于 2015-1-27 23:33
short或者byte如果参与运算的话就自动提升为int了,比如:byte a=1,b=2;        byte c=a+b;  就会报错 ...

楼主这种情况说的是对的
回复 使用道具 举报
邓士林 发表于 2015-1-27 22:25
先说废话:Java基本类型共有八种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte ...

楼主分析的好全面  学习了  以前就知道用 但是少问了一个为什么
回复 使用道具 举报
你少了个f亲
回复 使用道具 举报
恩恩  赞一楼一个
回复 使用道具 举报
因为2是常量  所以JVM在java的编译时期会检查该常量是否在short类型范围之内 如果在  那么就可以赋值  所以会编译通过 并不会损失精度。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马