在 Java 中将类型转换为字节

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

任何人都可以向我解释输出。

提前致谢!

Dic*_*ici 6

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)


Era*_*ran 5

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

  1. int 到 byte 的转换

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

  1. 双字节到字节的转换

这种转换比较复杂。

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

    323 是二进制的 00000000 00000000 00000001 01000011。将 323 转换为字节会保留最低(右)字节,即为 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,并且这个整数值可以表示为 long,那么第一步的结果就是 long 值 V。

      湾 否则,如果这个整数值可以表示为一个int,那么第一步的结果就是int值V。

    • 否则,以下两种情况之一必须为真:

      一种。该值必须太小(大的负值或负无穷大),并且第一步的结果是 int 或 long 类型的最小可表示值。

      湾 该值必须太大(大的正值或正无穷大),并且第一步的结果是 int 或 long 类型的最大可表示值。

  2. 第二步:

    • 如果 T 是 int 或 long,则转换的结果是第一步的结果。

    • 如果 T 是 byte、char 或 short,则转换的结果是第一步结果的收缩转换到类型 T(第 5.1.3 节)的结果。