无法将 128 分配给字节,为啥它会出错而不是溢出?

Posted

技术标签:

【中文标题】无法将 128 分配给字节,为啥它会出错而不是溢出?【英文标题】:Cannot assign 128 to byte, why does it error out instead of overflowing?无法将 128 分配给字节,为什么它会出错而不是溢出? 【发布时间】:2020-10-26 21:03:01 【问题描述】:

Java 中的字节范围从 -128 到 127。如果超过 127,它们会溢出。所以我将 128 分配给 byte 变量以了解溢出是如何工作的,但编译器显示错误消息:“类型不匹配:无法从 int 转换为字节”。

为什么我得到一个编译器错误而不是它溢出?

【问题讨论】:

你必须明确地转换。字节 B = (字节)128;因为 128 超出范围,所以它是一个 int。 javac 就是这么聪明,可以让你分配更小的值。 另外,邮政编码,而不是代码图像。在这种情况下确实没有任何理由粘贴图像。 溢出仅发生在算术运算期间。您编写了 int 文字,无法安全地转换为字节而不丢失数据,因此需要显式转换;在强制转换期间,会发生某种溢出。 感谢@matt 下次会改进格式。所以你的意思是Java不能允许将超出范围的数字分配给变量,除非使用强制转换?我的理解正确吗?谢谢! 对,javac 编译器会阻止您分配超出范围的值。您的错误是在编译期间发生的。 【参考方案1】:

javac 将允许您将范围内的值分配给字节。当您超出范围时,需要显式转换该值。

byte b = (byte)128; 

适用于编译器。要查看溢出,您可以尝试

byte b = 127;
b += 1;
System.out.println(b);

-128

可以在JLS 中找到螺母和螺栓。 Java 将以intlong 进行算术运算。

byte a = 1;
byte b = 2;
//byte c = a + b; //fails because the operation is performed as an int.
byte c = (byte)(a + b);

【讨论】:

嗨@Matt,如果我这样写,它仍然会显示错误消息:“byte B= 127; B=B+1; System.out.println(B);”你能帮忙解释一下吗?非常感谢! 你写的和我写的细微差别,b+=1;没关系。 b = b + 1;不行, b + 1 被视为整数,您必须强制转换。我真的很惊讶它以我写的方式工作,所以我在发布之前检查了它。 ideone.com/o7sNLU 如果您将 += 更改为 b+1 它将失败,如您所见。【参考方案2】:

一个字节是一个 8 位有符号整数值,可以保存 -128 到 127 之间的值。

您可以将 128 转换为一个字节 'byte b = (byte)128;',但由于二进制补码数字的工作方式,b 将等于 -128。

【讨论】:

【参考方案3】:

像 1、-32、128 或 7654321 这样的整数常量在 Java 中具有 int 类型。根本不允许将int 值分配给byte 变量。这就是您收到错误cannot convert from int to byte 的原因。要绕过它,您必须使用 type cast 将 int 值转换为 byte,b=(byte)128

真正的问题应该是,为什么您没有收到此代码的错误?

byte b = 100; // !!!! ASSIGNING int TO byte !!!!

您不会在此处收到错误,因为 special "assignment conversion" rule 仅适用于编译时常量表达式:

如果变量的类型是 byte、short 或 char,并且常量表达式的值可以在变量的类型中表示,则可以使用缩小原语转换。

【讨论】:

【参考方案4】:

类型 byte B = (byte)128;

而不是byte B = 128;

【讨论】:

以上是关于无法将 128 分配给字节,为啥它会出错而不是溢出?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我可以将字符分配给字符串对象而不是字符串对象的向量?

C语言中:char占1个字节,数值范围是-128到127. 我想问的是:char的数值范围为啥不是-128到128

为啥我们在 OpenGL (ES) android 中以字节分配块而不是浮点数,尽管我们大部分时间都使用浮点数

为啥 InputStream#read() 返回一个 int 而不是一个字节?

为啥分配给空列表(例如 [] = "")不会出错?

为啥 uint8_t 在分配给取消引用的 uint32_t 指针时使用了 4 个字节?