Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的字节类型转换_Java_Types_Casting - Fatal编程技术网

Java中的字节类型转换

Java中的字节类型转换,java,types,casting,Java,Types,Casting,我是Java的初学者。我遇到了一个叫做类型铸造的概念。 我有以下代码片段- 类演示 { 字节b; INTA=257; 双d=323.142 b=(字节)a; 系统输出打印ln(b); b=(字节)d; 系统输出打印ln(b); } 代码的输出为1 67 谁能给我解释一下输出结果吗 提前谢谢 byte b; int a=257; double d= 323.142 b=(byte)a; // 257-256=1 System.out.println(b); // now b is 1 b=(

我是Java的初学者。我遇到了一个叫做类型铸造的概念。 我有以下代码片段-

类演示
{
字节b;
INTA=257;
双d=323.142
b=(字节)a;
系统输出打印ln(b);
b=(字节)d;
系统输出打印ln(b);
}
代码的输出为
1
67

谁能给我解释一下输出结果吗

提前谢谢

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位有符号2的补码整数(这在第二种情况下很重要,为什么
67.142
变成
67
)。Java中的字节是有符号的,所以它的范围是
-2^7
2^7-1
——也就是说,
-128
127
。由于
257
位于
127
之上,因此您最终返回到
257-256=
1。也就是说,
256
被加或减,直到它落在范围内。同样的情况也发生在第二种情况下

因为257=100000001b 但当您将其转换为字节时,只能得到该数字的8位:
0000000 1b=1

字节类型以8位编码,因此其值介于-128和127之间。在您的例子中,按
字节
进行强制转换与计算模并四舍五入到
整数
相同。尝试以下代码,输出相同:

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

字节可以存储在
-128到127的范围内,这意味着1字节(8位)。

257
的二进制值在转换为字节后为
10000001
,这意味着8位(从
LSB
MSB
),这将得到
00000001
的值,它只是
1
。在这里,您要显式转换类型,以便在将较高的数据类型转换为较低的数据类型时发生数据丢失。后一个也一样。希望这将对您有所帮助。

的十六进制表示法

  • (257)=0x101
  • (323)=0x143
byte
只存储一个字节的数据,正如您在上面的十六进制表示中看到的突出显示部分:-

257的
b=0x01=1
和323.14的整数部分的
b=0x43=67


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

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

  • 整数到字节的转换
  • 将值为257(二进制格式为00000000000000000000000001)的整数转换为字节。因此,只保留int的最低(右)字节。因此,结果是二进制的00000001,即1

  • 双字节到字节的转换
  • 这种转换更为复杂

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

      323是二进制的00000000000000000001 01000011。 将323转换为字节将保留最低(右)字节,即67

    以下是有关此转换的说明:

    浮点数到整数类型的缩小转换 T采取两个步骤:

  • 在第一步中,如果T为long,则将浮点数转换为long;如果T为byte、short、char或int,则将浮点数转换为int int,具体如下:

    • 如果浮点数为NaN(§4.2.3),则转换的第一步结果为int或long 0

    • 否则,如果浮点数不是无穷大,则将浮点数四舍五入为整数值V,即四舍五入 使用IEEE 754四舍五入归零模式(§4.2.3)归零。然后呢 有两种情况:

      a。如果T是长的,并且这个整数值可以表示为长的,那么第一步的结果就是长值V

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

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

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

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

  • 第二步:

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

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


  • 可能的重复。看看,嗨!为什么要从256中减去它们?