float a = 33 + 33.3;//此语句是编译报错的

问题:
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位了,如果砍掉的是表示大小的指数位怎么办?所以小数强转是需要运算器进行运算的,而编译器无法进行运算,所以,编译也就报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值