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=1i2=(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