use*_*040 6 java types casting
我是 Java 的初学者。我遇到了一个叫做类型转换的概念。我有以下片段-
class Demo
{
byte b;
int a=257;
double d= 323.142
b=(byte)a;
System.out.println(b);
b=(byte)d;
System.out.println(b);
}
Run Code Online (Sandbox Code Playgroud)
代码的输出是 1
67
任何人都可以向我解释输出。
提前致谢!
该byte类型以 8 位编码,因此其值介于 -128 和 127 之间。在您的情况下,强制转换byte与计算模数并舍入为int. 试试下面的代码,输出是一样的:
int a = 257;
double d = 323.142;
System.out.println(a % 128);
System.out.println((int) d % 128);
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,您都在进行缩小转换,这可能会导致信息丢失。
您将一个值为 257 (00000000 00000000 00000001 00000001 二进制) 的 int 转换为一个字节。因此,只保留 int 的最低(右)字节。因此结果是二进制的 00000001,也就是 1。
这种转换比较复杂。
第二步与第一次转换相同:
323 是二进制的 00000000 00000000 00000001 01000011。将 323 转换为字节会保留最低(右)字节,即为 67。
以下是JLS关于此转换的说明:
从浮点数到整数类型 T 的缩小转换需要两个步骤:
第一步,将浮点数转换为 long(如果 T 是 long)或转换为 int(如果 T 是 byte、short、char 或 int),如下所示:
如果浮点数为 NaN(第 4.2.3 节),则转换的第一步的结果是 int 或 long 0。
否则,如果浮点数不是无穷大,浮点值将被舍入为整数值 V,使用 IEEE 754 向零舍入模式(第 4.2.3 节)向零舍入。那么有两种情况:
一种。如果 T 是 long,并且这个整数值可以表示为 long,那么第一步的结果就是 long 值 V。
湾 否则,如果这个整数值可以表示为一个int,那么第一步的结果就是int值V。
否则,以下两种情况之一必须为真:
一种。该值必须太小(大的负值或负无穷大),并且第一步的结果是 int 或 long 类型的最小可表示值。
湾 该值必须太大(大的正值或正无穷大),并且第一步的结果是 int 或 long 类型的最大可表示值。
第二步:
如果 T 是 int 或 long,则转换的结果是第一步的结果。
如果 T 是 byte、char 或 short,则转换的结果是第一步结果的收缩转换到类型 T(第 5.1.3 节)的结果。
| 归档时间: |
|
| 查看次数: |
13120 次 |
| 最近记录: |