gpt4 book ai didi

java - java中字节的奇怪行为

转载 作者:行者123 更新时间:2023-11-30 06:56:23 25 4
gpt4 key购买 nike

我有这个代码:

public class First
{
public static void main(String[] args)
{
byte b=50;
byte c=b*2; //Error
byte d=50*2; //d=100
byte e=(byte)258; //e=258%256;
byte f=(byte)128; //f=128%256;
}
}
  1. 我知道任何涉及byte的算术表达式都是第一个提升为 int 然后执行。因此我预计d=50*2也会报错,因为50*2的结果是一个int值,我们将其存储在 byte 中,没有任何显式类型转换。如果 Java 隐式进行转换,为什么 c=b*2 报告一个错误?
  2. 我知道如果我想存储一个值不在 byte 变量的范围内,那么我必须显式输入将其转换为 byte 并将存储的值是值模 256(字节大小)。因此,为什么 byte f=(byte)128 返回-128?因为 128 % 256 = 128,所以我期望的是 f=128,但它返回 -128。为什么?

非常感谢。

最佳答案

这是因为 50*2; 将在编译时解析,而 b*2; 将在运行时解析。因此,在编译时,Java 编译器确定 50*2; 的结果将是 100。但是在 b*2; 的情况下,你也提到了那个结果算术运算的类型是 int,编译器无法确定结果是否会超过 byte 限制,因此它会提示并希望您通过强制转换或更改类型来确保这些内容。

您可以使用javap -v Test.class 来验证。见下文:

 public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=2, args_size=1
0: bipush 100
2: istore_1
3: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
6: iload_1
7: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
10: return
LineNumberTable:
line 4: 0
line 5: 3
line 6: 10

对于你的第二个问题,@Eran 已经解释了使用 128 和 258 的位表示,你可以进一步阅读 JLS §5.1.3. Narrowing Primitive Conversion

A narrowing conversion of a signed integer to an integral type T simply discards all but the n lowest order bits, where n is the number of bits used to represent type T. In addition to a possible loss of information about the magnitude of the numeric value, this may cause the sign of the resulting value to differ from the sign of the input value.

关于java - java中字节的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34381267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com