我是Java的初学者。我遇到了一个名为Type Casting的概念。 我有以下代码段 -
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);
}
代码的输出为-1 67
任何人都可以向我解释输出。
提前致谢!
答案 0 :(得分:5)
在这两种情况下,您都在进行缩小转换,这可能会导致信息丢失。
将一个值为257(二进制为00000000 00000000 00000001 00000001)的int转换为一个字节。因此,只保留int的最低(右)字节。因此结果是二进制的00000001,即1。
这种转换更复杂。
第二步与第一次转换相同:
323是二进制的00000000 00000000 00000001 01000011。 将323转换为byte保留最低(右)字节,这样就可以得到67。
以下是JLS对此次转化的说明:
将浮点数转换为整数类型 T需要两个步骤:
在第一步中,如果T为long,浮点数将转换为long,如果T为byte,short,char或者,则转换为int int,如下:
如果浮点数为NaN(§4.2.3),则转换的第一步结果为int或long 0。
否则,如果浮点数不是无穷大,则将浮点值四舍五入为整数值V,舍入 使用IEEE 754舍入零模式(§4.2.3)向零。然后那里 有两种情况:
一个。如果T很长,并且这个整数值可以表示为long,那么第一步的结果就是长值V.
湾否则,如果此整数值可以表示为int,则第一步的结果是int值V.
否则,以下两种情况之一必须为真:
一个。该值必须太小(大幅度或负无穷大的负值),第一步的结果是 int或long类型的最小可表示值。
湾该值必须太大(大幅度或正无穷大的正值),第一步的结果是 int或long类型的最大可表示值。
- 醇>
第二步:
如果T为int或long,则转换结果为第一步的结果。
如果T是byte,char或short,则转换结果是转换为结果类型T(第5.1.3节)的结果 第一步。
答案 1 :(得分:4)
byte
类型以8位编码,因此它的值在-128到127之间。在您的情况下,按byte
进行转换与计算模数并舍入为{相同{1}}。尝试以下代码,输出是相同的:
int
答案 2 :(得分:3)
byte b;
int a=257;
double d= 323.142
b=(byte)a; // 257-256=1
System.out.println(b); // now b is 1
b=(byte)d; // 323.142-256=67
System.out.println(b); // now b is 67
字节数据类型是8位带符号的二进制补码整数(这在第二种情况下很重要,为什么67.142
变为67
)。 Java
中的字节已签名,因此其范围为-2^7
到2^7-1
- 即-128
到127
。由于257
高于127
,您最终会回到257-256=
1。这是256
被添加或减去,直到它落入范围。在第二种情况下也会发生。
答案 3 :(得分:2)
字节可以存储在-128 to 127
范围内,这意味着1字节(8位)。
转换为字节后,257
的二进制值为100000001
,这意味着8位(从LSB
到MSB
),它将获得00000001
的值,这只是1
{{1}}。在这里,您明确转换类型,以便在将较高数据类型转换为较低数据类型时发生数据丢失。同样适用于后者。希望这会对你有所帮助。
答案 4 :(得分:0)
因为257 = 100000001b 但是当你把它转换为字节时,你只得到这个数字的8位: 00000001b = 1
答案 5 :(得分:0)
的十六进制表示
byte
只存储一个字节的数据,正如您在上面的十六进制表示中看到突出显示的部分: -
b = 0x01 = 1
代表257,b = 0x43 = 67
代表整数部分323.14
注意: - 在Java中,double
使用52位尾数,因此我们可以表示32位整数而不会丢失数据。