问题:
A.byte b = 3 + 7;//此语句是编译通过的,是因为有常量优化机制, B.float f = 23 + 23.3;//此语句是编译报错的
首先对于A:
整数int到byte,short,char,如果在其范围内,是可以隐式转换的,其他都不能。
3+7的编译结果为10,即:
00000000 00000000 00000000 00001010
int强转为byte,直接砍掉前面3个字节(正数原反补一样。在计算机系统中,数值一律用补码来表示和存储) 即:
00001010
对于B:
原理:
首先,小数33.3默认为double类型,整数33自动提升为double类型进行运算,相加结果55.3也是double类型;8个字节的double类型转换为4个字节的float类型,在底层需要砍掉4个八位;
但是,小数底层二进制的表示和整数不一样。
以float为例:
4个字节,共32位,其中一位为小数位,23位表示小数位(精度,大小不超过1),剩余8位表示大小的指数位(幂)。
这样,底层结构不一样,就不能像int–>byte那样随意的砍掉前面4个8位了,如果砍掉的是表示大小的指数位怎么办?所以小数强转是需要运算器进行运算的,而编译器无法进行运算,所以,编译也就报错。