黑马程序员技术交流社区

标题: 请教大神们一个问题 byte b = 10可以这样写,但是 float f = 1.0 [打印本页]

作者: jingyarufeng    时间: 2016-9-19 23:09
标题: 请教大神们一个问题 byte b = 10可以这样写,但是 float f = 1.0
byte b = 10; 这里10是int型的,但是系统会判断10在不在byte的范围内,如果在,这样赋值是可以的.那为什么  float f = 1.0; 这里1.0是double型的,但是1.0应该也在float范围内吧,既然上面的都可以那样写
那下面的为什么 非得写成 float f = 1.0f呢? 难道它就不能判断?是什么原因呢?不要说是规定,就算是规定
也肯定是会有原因的吧!

作者: O-P龚    时间: 2016-9-19 23:16
等号左边的 b 和 f 都是变量名,不是强制转换符,double 数据赋值给folat 不加转换符当然不行.
作者: jingyarufeng    时间: 2016-9-19 23:27
O-P龚 发表于 2016-9-19 23:16
等号左边的 b 和 f 都是变量名,不是强制转换符,double 数据赋值给folat 不加转换符当然不行. ...

12的默认类型不是int 型? int型赋值给byte型需要强转吧!
作者: haoge349    时间: 2016-9-19 23:59
不同的底层数据类型ba
作者: jingyarufeng    时间: 2016-9-20 00:16
haoge349 发表于 2016-9-19 23:59
不同的底层数据类型ba

应该是因为某种机制制约了不可以这样做,但是好想知道为什么....
作者: haoge349    时间: 2016-9-20 00:43
jingyarufeng 发表于 2016-9-20 00:16
应该是因为某种机制制约了不可以这样做,但是好想知道为什么....

应该是整形是按每个二进制的位转化为十进制,可以直接砍掉前面的一长串零来进行数据类型往低了转,浮点型是以每个二进制位为次幂做的浮点运算,这个可能必须强转了,自动优化直接转可能会出错
作者: 猴哥    时间: 2016-9-20 00:48
整数的常量优化机制,可能是浮点类型的数优化起来比较复杂,所以底层就没有对它进行优化。
作者: jingyarufeng    时间: 2016-9-22 14:27
查了好多的资料。现在基本上有了答案。大概的意思int型的在符合byte的取值范围内时,把前面多余的零掰掉就可以了。,而float和double在底层的二进制存储形式不同。而且还有好几种存储方式。所以要这样做很麻烦,而且还要告诉人家你要用哪种方式进行存储。还有浮点数也无法精确的表示一个数。当你要掰的时候必然有可能会损失精度。所以说有单精度和双精度之所。不是表示的数的大小不同,而是两种小数的精确度不同。所以,我们还是要从精确度的方面而不是从取值范围去看float和double的区别。这就是我的理解。希望也可以帮到大家。好像以前也问过这个问题,而且也知道了答案。但是时间长了就忘了。。。所以大家要是有什么问题就算有了答案还是记录下来的好。以免遗忘。谢谢大家的热情回复
作者: wu971856966    时间: 2016-9-22 14:34
小的运算的时候会自动转换成大的   但大的变成小的就需要强转了
作者: u8u8u80pp    时间: 2016-9-22 22:17
因为他有小数点,有小数点就回复杂化,因为补位0会舍弃,小数点会占位,你不知道他会随哪个0舍弃,系统也怕,所以必须加,不加就报错
作者: 18001105207    时间: 2016-9-22 22:49
系统判断如果10在byte范围内,不会损失精度。而将double型转化为float型就有可能损失精度。
作者: huangweicong    时间: 2016-9-22 22:52
6666666666
作者: 梁程    时间: 2016-9-22 22:53
会损失精度
作者: 江月念华    时间: 2016-9-22 23:04
受教了,就是byte取值范围不应是-128到127吗,下面的12是什么鬼
作者: hlll    时间: 2016-12-5 23:11
受教了,加油

作者: hlll    时间: 2016-12-11 09:00
应该是因为在计算机中,小数本来就不能精确的被表示,所以float,double都是一一对应的精度,所以系统无法判断吧?





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