最近,当我在java中使用类型转换概念时,我已经看到将较大变量的类型转换为较小的变量会导致较大变量的模数由较小变量的范围产生。任何人都可以详细解释这个为什么这个是这种情况,是否适用于任何显式类型转换?。
class conversion {
public static void main(String args[])
{
double a = 295.04;
int b = 300;
byte c = (byte) a;
byte d = (byte) b;
System.out.println(c + " " + d);
}
}
上面的代码给出了d为44的答案,因为300模256是44。请解释为什么会出现这种情况以及c的值会发生什么?
答案 0 :(得分:1)
这是一个设计决策,它一直支持C编程语言,也可能是C语言的前提。
当您从较大的整数类型转换为较小的整数类型时,会发生最高位被删除的情况。
为什么呢?最初(当前)因为这是硬件整数指令所支持的。
"其他"这样做的逻辑方法(即不是Java定义整数缩小的方式)将转换为较小类型中可表示的最大(或最小)值; e.g。
// equivalent to real thin in real java
// b = (byte) (Math.max(Math.min(i, 127), -128))
将{+ 1}作为b
的值。顺便说一句,这是将浮点值转换为整数值时发生的情况,并且该值太大。这就是c
示例中发生的事情。
你也说过:
上面的代码给出了d为44的答案,因为300模256为44。
事实上,正确的计算方法是:
int d = ((b + 128) % 256) - 128;
这是因为Java byte
类型的范围是-128到+127。