Java:为什么';t二进制或按预期工作(参见下面的代码)?

Java:为什么';t二进制或按预期工作(参见下面的代码)?,java,binary,Java,Binary,我不理解以下代码的输出: public static void main(String[] args) { int i1, i2, i3, i4; byte b; i1 = 128; b = (byte) i1; i2 = (int) b; i3 = 0 | b; i4 = 1 << 7; System.out.format("i1: %d b: %d i2: %d i3: %d i4: %d\n", i

我不理解以下代码的输出:

public static void main(String[] args) {
    int i1, i2, i3, i4;
    byte b;
    i1 = 128;
    b = (byte) i1;
    i2 = (int) b;
    i3 = 0 | b;
    i4 = 1 << 7;
    System.out.format("i1: %d   b: %d   i2: %d   i3: %d   i4: %d\n", i1, b, i2, i3, i4);
}

因为
byte
是一个8位有符号整数,所以最高有效位为1的二进制表示被解释为负值,这就是
b
变成
-128
的原因,我完全同意。我也明白,在进行转换时保持解释的一致性可能是一个好主意,就像使用
i2
一样。但是
i3
i4
是否应该具有相同的位模式,从而映射到相同的
int
值?

否,
i4
不是字节值,而是
int
。这意味着它的符号位是位31,而不是位7


更新
i3
也是一个
int
,但它是通过扩展
字节
来初始化的,因此它保留了
字节
值的符号。

不,
i4
不是字节值,而是
int
。这意味着它的符号位是位31,而不是位7

更新
i3
也是一个
int
,但它是通过扩展
字节
来初始化的,因此它保留了
字节
值的符号。

i3 = 0 | b;
我猜0 | b部分被计算为一个字节,然后结果被转换为int,而

i4 = 1 << 7;
i4=1In

我猜0 | b部分被计算为一个字节,然后结果被转换为int,而

i4 = 1 << 7;
i4=1在这行中:

i3 = 0 | b;
由于
|
运算符的作用,“b”变量自动升级为带符号扩展名的
int
类型,因此变为
(int)-128
,即
0xffffff80

当用零表示“或”时,其值仍然相同,即此行中的-128:

i3 = 0 | b;
由于
|
运算符的作用,“b”变量自动升级为带符号扩展名的
int
类型,因此变为
(int)-128
,即
0xffffff80


当用零表示“或”时,其值仍然相同,即-128

符号扩展使
i2
i3
为负值

在表达式
(0 | b)
中,
b
被提升为int,符号扩展作为提升的一部分出现


这在指定给
i4
的表达式中没有发生。常量
1
7
已经是整数,因此不涉及符号扩展。

符号扩展是使
i2
i3
为负值的原因

在表达式
(0 | b)
中,
b
被提升为int,符号扩展作为提升的一部分出现


这在指定给
i4
的表达式中没有发生。常量
1
7
已经是整数,因此不涉及符号扩展。

这很简单<代码>i3=0 | b
的计算方式类似于
字节
,然后将其转换为
int
。然而,
i4=1这很简单<代码>i3=0 | b
的计算方式类似于
字节
,然后将其转换为
int
。而
i4=1
i2=(int)b

i3=0 | b

i3语句相当于:

i3=0 |((int)b)=0 | i2
因此,它自然会与i2具有相同的值

i2=(int)b

i3=0 | b

i3语句相当于:


i3=0 |((int)b)=0 | i2
因此,如果您想获得字节中位模式的无符号值,那么它自然会与i2具有相同的值:

b & 0xff

如果要获取字节中位模式的无符号值,请参见。

b & 0xff

另请参见。

但i3也是一个国际标准。。。为什么是负数呢?i3赋值与i2赋值相似。。。表达式返回一个转换为int的字节。但i3也是int。。。为什么是负数呢?i3赋值与i2赋值相似。。。表达式返回一个被转换为int的字节。我只想表达我对Java字节的愤怒。据我所知,字节的定义是一个介于0和255之间的数字,因此他们在Java中对字节所做的完全混乱是不能原谅的。-128..127调用了一个新的原始数据类型。我想看看这个定义。我在谷歌上搜索的定义是一个字节是8位,足以代表一个字符。我想我已经习惯了颜色分量RGB是0到255之间的字节。ASCII表还将字符映射到此范围内的数字。我从未尝试过键入Alt+(-)+(数字),它总是一个正数0..255。我对Java中字节数据类型的概念感到震惊,我只想表达我对Java字节的愤怒。据我所知,字节的定义是一个介于0和255之间的数字,因此他们在Java中对字节所做的完全混乱是不能原谅的。-128..127调用了一个新的原始数据类型。我想看看这个定义。我在谷歌上搜索的定义是一个字节是8位,足以代表一个字符。我想我已经习惯了颜色分量RGB是0到255之间的字节。ASCII表还将字符映射到此范围内的数字。我从未尝试过键入Alt+(-)+(数字),它总是一个正数0..255。我对Java中字节数据类型的概念感到震惊。“0 | b”不是作为字节计算的。在OR操作之前,“b”被加宽为int。“0 | b”不作为字节计算。“b”在OR操作之前被加宽为int。你知道为什么&起作用和|不起作用的确切原因吗?你知道为什么&起作用和|不起作用的确切原因吗?我会说1和7是int类型,结果也是如此,所以为什么不涉及符号扩展。是的-这比我说的更正确,也更容易理解编写-编辑answ