在Java中,将正整数转换为byte类型后如何变成负值?

9
public class Test1 {

    public static void main(String[] args) {

        byte b1=40;
        byte b=(byte) 128;

        System.out.println(b1);
        System.out.println(b);
    }
}

输出结果为

40
-128

第一个输出结果是40,我理解。但第二个输出结果为-128,这怎么可能?它是否超出了其范围?如果是的话,在进行字节强制转换后它如何工作......请帮帮我。


溢出的最大值为127。 - nachokk
这个问题与这个问题有些相似。 - Mark
符号扩展,加上 Byte.MAX_VALUE 是 127。 - Ted Hopp
2个回答

12

当你将128(二进制中的10000000)转换为8位byte类型时,符号位设置为1,因此该数字被解释为负数。Java使用二进制补码表示法,因此10000000-128——可用8位表示的最小负数。

按照这种解释方式,129变成了-127130变成了-126,等等,一直到255(二进制中的11111111),它变成了-1


进一步解释,最高位将成为您整数值的符号。 - Mark

0

Java中的一个字节以8位二进制补码格式表示。如果您有一个在范围内的int 128-255,并将其转换为byte,那么它将成为一个具有负值(介于-1和-128之间)的字节。

话虽如此,您应该避免使用byte,因为它们存在问题。如果您将结果强制转换为byte,则会注意到运算符实际上返回int。在Java中,您应该坚持使用int和long,因为它们的实现更好。


你所说的 byte 没有问题。用户应该知道输入范围,并根据相应的占位符进行选择。 - Abhishek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接