Java中的字节类型转换
我是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=(
类演示
{
字节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位整数而不会丢失数据。在这两种情况下,您都在进行缩小转换,这可能会导致信息丢失
- 在第一步中,323.142从double转换为int,因此变为323
- 第二步与第一次转换相同: 323是二进制的00000000000000000001 01000011。 将323转换为字节将保留最低(右)字节,即67
- 如果浮点数为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中减去它们?