在Java中键入cast into byte

时间:2014-10-20 12:22:42

标签: java types casting

我是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

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

提前致谢!

6 个答案:

答案 0 :(得分:5)

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

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

    1. 将double转换为byte
    2. 这种转换更复杂。

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

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

      以下是JLS对此次转化的说明:

        

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

           
          
      1. 在第一步中,如果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类型的最大可表示值。

        •   
      2.   
      3. 第二步:

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

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

        •   
      4.   

答案 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^72^7-1 - 即-128127。由于257高于127,您最终会回到257-256= 1。这是256被添加或减去,直到它落入范围。在第二种情况下也会发生。

答案 3 :(得分:2)

字节可以存储在-128 to 127范围内,这意味着1字节(8位)。 转换为字节后,257的二进制值为100000001,这意味着8位(从LSBMSB),它将获得00000001的值,这只是1 {{1}}。在这里,您明确转换类型,以便在将较高数据类型转换为较低数据类型时发生数据丢失。同样适用于后者。希望这会对你有所帮助。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

的十六进制表示
  • (257)= 0x1 01
  • (323)= 0x1 43

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

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

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