在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); 

在这两种情况下,您都在进行缩小转换,这可能会导致信息丢失。

  1. 将int转换为byte

您将值为257(二进制为00000000 00000000 00000001 00000001)的int转换为一个字节。 因此,只保留int的最低(右)字节。 因此结果是二进制的00000001,即1。

  1. 将double转换为byte

这种转换更复杂。

  • 在第一步中,323.142从double转换为int,因此它变为323。
  • 第二步与第一次转换相同:

    323是二进制的00000000 00000000 00000001 01000011。 将323转换为byte保留最低(右)字节,这样就可以得到67。

以下是JLS关于此转换的说明:

将浮点数转换为整数类型T需要两个步骤:

  1. 在第一步中,浮点数转换为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类型的最大可表示值。

  2. 在第二步:

    • 如果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^72^7-1 – 即-128127 。 由于257高于127 ,你最终会回257-256= 1.这是256加或减直到它落入范围。在第二种情况下也会出现这种情况。

字节可以存储在-128 to 127的范围之间,这意味着1字节(8位)。 转换为字节后, 257二进制值为100000001 ,这意味着8位(从LSBMSB )将得到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位整数而不会丢失数据。