为什么将较大变量类型转换为较小变量会导致较大变量取模较小变量的范围
Why Type Casting of larger variable to smaller variable results in modulo of larger variable by the range of smaller variable
最近,当我在研究 java 中的类型转换概念时,我看到将较大的变量类型转换为较小的变量会导致较大变量的取模范围较小 variable.Can任何人都请详细解释为什么会这样,对于任何显式类型转换都是如此吗?
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.Please 请解释为什么会这样以及 c 的值会发生什么变化?
这是一个可以追溯到 C 编程语言的设计决策,也可能是 C 的前身。
当您从较大的整数类型转换为较小的整数类型时,会发生什么情况,即最高位被删除。
为什么?最初(和当前)因为这是硬件整数指令支持的内容。
执行此操作的 "other" 合乎逻辑的方式(即不是 Java 定义整数缩小的方式)将转换为较小类型中可表示的最大(或最小)值;例如
// equivalent to real thin in real java
// b = (byte) (Math.max(Math.min(i, 127), -128))
会给出 +127 作为 b
的值。顺便说一句,当您将浮点值转换为整数值并且该值太大时会发生这种情况。这就是您的 c
示例中发生的情况。
你还说:
The above code gives the answer of d as 44 since 300 modulo 256 is 44.
事实上,正确的计算是:
int d = ((b + 128) % 256) - 128;
那是因为Java byte
类型的范围是-128到+127。
最近,当我在研究 java 中的类型转换概念时,我看到将较大的变量类型转换为较小的变量会导致较大变量的取模范围较小 variable.Can任何人都请详细解释为什么会这样,对于任何显式类型转换都是如此吗?
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.Please 请解释为什么会这样以及 c 的值会发生什么变化?
这是一个可以追溯到 C 编程语言的设计决策,也可能是 C 的前身。
当您从较大的整数类型转换为较小的整数类型时,会发生什么情况,即最高位被删除。
为什么?最初(和当前)因为这是硬件整数指令支持的内容。
执行此操作的 "other" 合乎逻辑的方式(即不是 Java 定义整数缩小的方式)将转换为较小类型中可表示的最大(或最小)值;例如
// equivalent to real thin in real java
// b = (byte) (Math.max(Math.min(i, 127), -128))
会给出 +127 作为 b
的值。顺便说一句,当您将浮点值转换为整数值并且该值太大时会发生这种情况。这就是您的 c
示例中发生的情况。
你还说:
The above code gives the answer of d as 44 since 300 modulo 256 is 44.
事实上,正确的计算是:
int d = ((b + 128) % 256) - 128;
那是因为Java byte
类型的范围是-128到+127。