首先是byte类型,占一个字节,8bit,也就是八个二进制组成。
int4个字节,4个字节,总共占32个bit二进制。
// 定义了三个byte类型的变量,b1,b2,b3
// b1的值是3,b2的值是4,b没有值
byte b1 = 3, b2 = 4, b;
//做加法运算先进行类型提升,变为int形,结果也是int型,所以int型返回byte类型就会出现可能损失精度的异常
// b = b1 + b2; 错误的
b = 3 + 4; // 常量,先把结果计算出来,然后看是否在byte的范围内,如果在就不报错。
通过大的类型强制转换小的类型可能会出现损失精度的问题。
如下:
long y = 2147483679L; 这里的大小是大于2的31次方-1的,所以是越界的
int x = (int) y; 接受后肯定会损失精度
System.out.println(x); 注意是怎么结算这个值
分析过程:
我们要想知道结果是什么,就应该知道是如何进行计算的。
而我们又知道计算机中数据的运算都是补码进行的。
而要得到补码,首先要计算出数据的二进制。
A:获取2147483679L这个数据的二进制。
10000000000000000000000000011111
因为这个数是正数 这是2147483679的原码,也是反码,还是补码。
如果是负数也可以直接用这种方式,最后将答案取反就可以了
B:做截取操作,截成int类型的了。
10000000000000000000000000011111
这个结果是补码。
C:已知补码求原码。
符号位 数值位
补码: 1 为负并执行反码操作 0000000000000000000000000011111
反码: 1 1111111111111111111111111100001
原码: 1 1111111111111111111111111100001
最后等于-2147483617
谢谢观看,点个赞吧!