gpt4 book ai didi

java - “Type mismatch: cannot convert int to byte”

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:13:13 27 4
gpt4 key购买 nike

我看到有人问关于错误“类型不匹配:无法将 int 转换为字节”的问题。但它们大多是由涉及的算术运算引起的。

这是我的案例:
(当我想在 Eclipse Kepler 中玩位时会发生这种情况)

//java 7 binary literals

byte a = 0b01111111; //8-bit it compiles

byte b = 0b10000000; //8-bit error: Type mismatch: cannot convert int to byte.

byte c = (byte) 0b10000000; //8-bit it works fine if casted.

问题是,如果它是 8 位并且最高位是 1,那么编译器会给出错误。我想知道为什么。前缀 0b 表示它是二进制文字,那么为什么编译器将最高位作为带符号的 int 数字或类似的数字?

感谢您的回答。

[编辑 3:]

byte a = -128; //a = 0xFF = 11111111 (8 bits), compiler says ok.
byte b = 0b11111111; //compiler error

[Edit2: 按位 & 运算也会以某种方式触发错误]

byte a = 0b00000000;  //8 bits
a = (a&0xFF); //gives same error: Type mismatch: cannot convert int to byte
a = (byte)(a&0xFF); //it is fine to cast

[Edit1:截图已更新] enter image description here

enter image description here

最佳答案

你说对了,怀疑这是关于有符号整数。在 Java 中,所有整数类型(byteshortintlong)总是有符号的。 Java 使用二进制补码来存储有符号(读取“所有”)值。这基本上意味着,如果任何类型的第一位(不是文字中指定的第一位,而是存储的第一位)为 1,则该数字为负数。如果为 0,则为正。

第二个重要的事情是:Java 中没有 BYTE 文字。有 int 文字和 long 文字。写下的每个数字(无论是二进制(0b 前缀)、八进制(0 前缀)、十进制(无前缀)还是十六进制(0x 前缀))都是整数文字,除非您附加 L (小写或大写),它是 long。没有办法直接写下任何 shortbyte

现在,这意味着您写下的所有这些示例都首先创建了一个 int。您不会在那里创建 byte

所以,最后一部分是,如果您尝试将 int 存储在 byte 中会发生什么 - 不强制转换或强制转换。如果您显式转换,您基本上会告诉 Java 忽略任何不适合的位。它们将被切断——即使这改变了数字的值(例如,见下文)。如果你不施放,位仍然会被削减。但是 Java 不会那样做,如果它改变了值 - 以确保您真正意味着您正在做的事情。

将这一切链接到问题中的示例:
int 0b01111111 是 127
byte 0b01111111 是 127
-> 可以在没有任何溢出的情况下进行转换,因此即使没有显式转换,Java 也会执行此操作

int 0b10000000 是 128
字节 0b10000000 是 -128
-> 转换时出现溢出问题,因此如果没有显式转换,Java 将抛出错误。

关于java - “Type mismatch: cannot convert int to byte”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20026942/

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