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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© DoubleUUU 中级黑马   /  2015-11-16 14:13  /  660 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

搞不懂为什么
byte b=6+4;
没有问题而(这不也是int转换成byte不会损失精度吗?)
byte b1=4;
byte b2=6;
byte b=b1+b2;
就不行。。(已经定义了类型,反而会报损失精度的错误)
求大神解释一下?

12 个回复

倒序浏览
因为是变量会变动的,所以没法判断是不是超了范围
回复 使用道具 举报
黑夜中那颗星 发表于 2015-11-16 14:38
因为是变量会变动的,所以没法判断是不是超了范围

但是不是已经定义了类型吗?也不行?
回复 使用道具 举报
DoubleUUU 发表于 2015-11-16 14:46
但是不是已经定义了类型吗?也不行?

我指的是值可能会变动,不是类型
回复 使用道具 举报
4+6结果为10,即00000000 00000000 00000000 00001010
int转为byte,去掉3个8位(正数原反补一样的),结果为00001010,在byte范围内,编译通过

但是 float f = 5+5.2会报错
回复 使用道具 举报
lvcj 发表于 2015-11-16 16:49
4+6结果为10,即00000000 00000000 00000000 00001010
int转为byte,去掉3个8位(正数原反补一样的),结果为000 ...

把5.2标记为float型即5.2f就不会报错。感觉老理不清,好乱
回复 使用道具 举报
6666666666666666666666
回复 使用道具 举报
lvcj 中级黑马 2015-11-16 18:46:00
8#
DoubleUUU 发表于 2015-11-16 18:00
把5.2标记为float型即5.2f就不会报错。感觉老理不清,好乱

先记住,隐式转换只发生在int,byte short,char范围内
5.2默认为double类型,相加还是double类型.
double为8个字节,转为float为4个字节,砍掉前面四个八位
但是小数底层的二进制表示和整数不同
float举例:四个字节,32位,第一位为符号位,23位小数位,八位为指数位(所以float是四个字节,但是范围比int大的原因),如果砍掉的四个八位为指数位呢?所以小数强转需要运算器进行运算的,而编译器无法进行运算,所以报错
回复 使用道具 举报
lvcj 发表于 2015-11-16 16:49
4+6结果为10,即00000000 00000000 00000000 00001010
int转为byte,去掉3个8位(正数原反补一样的),结果为000 ...

人家一开始把4还有6定义成了byte类型,
两个byte类型的数字相加又怎么会变成int类型呢?
回复 使用道具 举报
lvcj 中级黑马 2015-11-16 19:41:35
10#
Phy_zhang 发表于 2015-11-16 18:54
人家一开始把4还有6定义成了byte类型,
两个byte类型的数字相加又怎么会变成int类型呢? ...

整型默认为int类型,两个byte数据相加,会自动提升到Int类型
回复 使用道具 举报
lvcj 发表于 2015-11-16 18:46
先记住,隐式转换只发生在int,byte short,char范围内
5.2默认为double类型,相加还是double类型.
double为8 ...

谢了,明白了
回复 使用道具 举报
sshh11 中级黑马 2015-11-16 22:28:22
12#
两个byte类型的数字相加又怎么会变成int类型呢?
回复 使用道具 举报
sshh11 发表于 2015-11-16 22:28
两个byte类型的数字相加又怎么会变成int类型呢?

java默认整型为int,会自动隐式提升
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马