请不要将其标记为重复。这完全是一个不同的问题?我已经完成了关于这个领域的一系列问题,之前在这个网站上询问过。
我引用Herbert Schildt的话:铸造不兼容的类型 - 如果整数的值大于一个字节的范围,它将以模数(整数除法的余数除以)字节范围(-128到127)减少。
现在考虑一下: 字节b =(字节)246;
System.out.println("---"+246%256); //this gives 246
System.out.println("---value of b after casting an int to byte---" + b);// this gives -10
Java中的字节是有符号的,所以它的范围是-2 ^ 7到2 ^ 7-1 - 即-128到127.由于246高于127,我们最终会回绕到256-246 = 10。也就是说,基本上加上或减去256(2 ^ 8)直到它落入范围。
赫伯特的答案是什么?我认为它应该是256 - (246%256)= 10.(因为246再次超出字节的范围。)但我怎么知道它是246-256还是256-246。我知道它可以通过实现2的补码来计算。我需要知道它而不使用2的补码。(只需加上或减去246-256或256-246。)
答案 0 :(得分:0)
将int转换为byte。 Java将int的最后8位保存到byte并抛出其他位。
byte b = (byte) (246+1024); // -10
当您需要将其打印为unsinged时,请使用Byte.totoUnsignedInt()
byte b = (byte) 246;
int i = Byte.toUnsignedInt(b);
System.out.println(i);