为什么说Java的强转会精度损失?
强制类型转换规则: 容量大的转为容量小的数据类型,使用时加上强转符号,也就是高精度->低精度转换
例:
byte b = (byte) 1000;
System.out.println(b); // 为什么这里会造成精度溢出? 输出结果为:-24
我们知道在java种 ‘int’ 是 4 字节,每个字节占 8 bit,而**‘byte’**是 1 字节。
得出结论: int -> byte 32bit->8bit`
int a = 1000;
// 十进制 1000 的二进制则是: 00000000 00000000 00000011 11101000
// 所以 32bit 只取 8bit 得到 byte // 11101000
// 11101000 在二进制中: 最高位为符号位 0表示正数 1表示负数
// 在计算机中运算时 都是以补码进行运算
// 11101000 -> 反码: 符号位不变其余位取反 10010111
// 反码: 10010111 -> 补码:反码+1 10011000
// 由于 10011000 符号位是1 所以是负数 最终结果为 -24
byte b1 = (byte) a;
System.out.println(b1); //-24
Java中将大容量数据类型转换为小容量类型(如int到byte)时,会丢失精度,因为只保留了低位的位数。例如,int类型的1000转换为byte时,只取8位,高位被截断。在二进制中,1000的低8位为11101000,由于最高位是符号位,这里的1表示负数,经过补码计算后结果为-24,导致精度溢出。


被折叠的 条评论
为什么被折叠?



