在Java中键入cast into byte
我是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); }
代码的输出是-167
任何人都可以向我解释输出。
提前致谢!
字节类型以8位编码,因此它的值在-128和127之间。在您的情况下,逐个字节的转换与计算模数并舍入为int相同。 尝试下面的代码,输出是一样的:
int a = 257; double d = 323.142; System.out.println(a % 128); System.out.println((int) d % 128);
在这两种情况下,您都在进行缩小转换,这可能会导致信息丢失。
- 将int转换为byte
您将值为257(二进制为00000000 00000000 00000001 00000001)的int转换为一个字节。 因此,只保留int的最低(右)字节。 因此结果是二进制的00000001,即1。
- 将double转换为byte
这种转换更复杂。
- 在第一步中,323.142从double转换为int,因此它变为323。
-
第二步与第一次转换相同:
323是二进制的00000000 00000000 00000001 01000011。 将323转换为byte保留最低(右)字节,这样就可以得到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,则第一步的结果是长值V.
湾 否则,如果此整数值可以表示为int,则第一步的结果是int值V.
否则,以下两种情况之一必须为真:
一个。 该值必须太小(大幅度或负无穷大的负值),第一步的结果是int或long类型的最小可表示值。
湾 该值必须太大(大幅度或正无穷大的正值),第一步的结果是int或long类型的最大可表示值。
在第二步:
如果T为int或long,则转换结果是第一步的结果。
如果T是byte,char或short,则转换的结果是第一步结果的类型T(第5.1.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
加或减直到它落入范围。在第二种情况下也会出现这种情况。
字节可以存储在-128 to 127
的范围之间,这意味着1字节(8位)。 转换为字节后, 257
二进制值为100000001
,这意味着8位(从LSB
到MSB
)将得到00000001
值,这只是1
。 在这里,您明确转换类型,以便在将较高数据类型转换为较低数据类型时发生数据丢失。 同样适用于后者。 希望这会帮助你。
因为257 = 100000001b但是当你在字节中转换它时你只得到这个数字的8位:00000001b = 1
hex表示
- (257)= 0x1 01
- (323)= 0x1 43
byte
只存储一个字节的数据,正如您在上面的hex表示中看到突出显示的部分: –
对于257, b = 0x01 = 1
对于b = 0x43 = 67
的整数部分, b = 0x43 = 67
注意: –在Java中, double
使用52位尾数,因此我们可以表示32位整数而不会丢失数据。