【问题标题】:Type casting into byte in Java在Java中将类型转换为字节
【发布时间】:2014-12-15 10:25:36
【问题描述】:

我是 Java 初学者。我遇到了一个名为 Type Casting 的概念。 我有以下sn-p-

    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

谁能解释一下输出。

提前致谢!

【问题讨论】:

标签: java types casting


【解决方案1】:
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

byte 数据类型是一个 8 位有符号二进制补码整数(这在第二种情况下很重要,为什么 67.142 变成 67)。 Java 中的字节是有符号的,因此它的范围是 -2^72^7-1 - 即,-128127。由于257 高于127,你最终会绕到257-256=1。即256 被添加或减去,直到它落入范围内。同样的情况也发生在第二种情况下。

【讨论】:

  • 嗨!为什么要从 256 中减去它们?
【解决方案2】:

因为 257 = 100000001b 但是当你把它转换成字节时,你只会得到这个数字的 8 位: 00000001b = 1

【讨论】:

    【解决方案3】:

    byte 类型编码为 8 位,因此它的值介于 -128 和 127 之间。在您的情况下,通过 byte 进行强制转换与计算模数并舍入到 int 相同。试试下面的代码,输出是一样的:

    int a = 257;
    double d = 323.142;
    System.out.println(a % 128);
    System.out.println((int) d % 128);
    

    【讨论】:

      【解决方案4】:

      Byte 可以存储在-128 to 127 的范围内,这意味着 1 Byte(8 位)。 257 的二进制值在转换为字节后是 100000001,这意味着 8 位(从 LSBMSB)将得到 00000001 的值,只不过是 1。在这里,您正在显式转换类型,因此在将较高数据类型转换为较低数据类型时会发生数据丢失。后一个也是如此。希望这会对你有所帮助。

      【讨论】:

        【解决方案5】:

        十六进制表示

        • (257) = 0x101
        • (323) = 0x143

        byte 只存储一个字节的数据,正如您在上面的十六进制表示中看到的突出显示的部分:-

        b = 0x01 = 1 表示 257,b = 0x43 = 67 表示 323.14 的整数部分

        注意:-在 Java 中,double 使用 52 位尾数,因此我们可以表示 32 位整数而不会丢失数据。

        【讨论】:

          【解决方案6】:

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

          1. int 到字节的转换

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

          1. double 到 byte 的转换

          这个转换比较复杂。

          • 在第一步中,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。

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

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

              一个。该值一定是太小了(大的负值或负无穷大),第一步的结果是 int 或 long 类型的最小可表示值。

              b.该值一定是太大(一个幅度很大的正值或正无穷大),第一步的结果是 int 或 long 类型的最大可表示值。

          2. 第二步:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-05-12
            • 2021-08-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-03
            • 1970-01-01
            • 2010-11-15
            相关资源
            最近更新 更多