Java “;类型不匹配:无法将int转换为字节”;

Java “;类型不匹配:无法将int转换为字节”;,java,byte,bit-manipulation,Java,Byte,Bit Manipulation,我看到有人问关于错误“类型不匹配:无法将int转换为byte”的问题。但它们大多是由涉及的算术运算引起的 以下是我的案例: (当我想在Eclipse开普勒中使用比特时会发生这种情况) 问题是,如果它是8位,最高位数是1,那么编译器会给出错误。 我想知道为什么。前缀0b意味着它是一个二进制文本,那么为什么编译器将最高的数字作为有符号的整数数字或类似的东西呢 谢谢你的回答 [编辑部3:] byte a = -128; //a = 0xFF = 11111111 (8 bits), compiler

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

以下是我的案例:
(当我想在Eclipse开普勒中使用比特时会发生这种情况)

问题是,如果它是8位,最高位数是1,那么编译器会给出错误。 我想知道为什么。前缀0b意味着它是一个二进制文本,那么为什么编译器将最高的数字作为有符号的整数数字或类似的东西呢

谢谢你的回答

[编辑部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
[编辑1:屏幕截图更新]


你说得有道理,怀疑这是关于有符号整数的。在Java中,所有整数类型(
byte
short
int
long
)都是有符号的。Java使用2的补码来存储签名(读取“all”)值。这基本上意味着,如果任何类型的第一位(不是文本中指定的第一位,而是存储的第一位)为1,则该数字为负数。如果为0,则为正值

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

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

因此,最后一部分是,如果您尝试在
字节中存储
int
,而不使用强制转换或使用强制转换,会发生什么情况。 如果您是明确地进行强制转换,那么基本上会告诉Java忽略任何不合适的部分。它们将被剪切-即使这改变了数字的值(例如,见下文)。 如果你不铸造,钻头仍会被切割。但是Java不会这样做,如果它改变了值-以确保你真正的意思是你在做什么

要将此全部链接到问题的示例:
int 0b01111111
is 127
字节0b01111111
为127
->在没有任何溢出的情况下,转换是可能的,因此Java即使没有显式强制转换也能做到这一点

int 0b10000000
is 128
字节0b10000000
为-128

->转换时会发生溢出,因此如果没有显式强制转换,Java将抛出错误。

我认为Java中的字节是有符号的,这将使0b10000000超出范围。127将是可能的最大字节,原因是这两个字节都表示负数。

字节变量可以包含值0b1000000,但由于它们是有符号的,因此表示整数值-128。它无法转换文本的原因是,当您将其作为没有强制转换的文本写入时,编译器将其视为(int)0b10000000,即正128的整数值


任何大于127的整数值都超出字节的界限,因为字节是有符号的,并且只能保存-128到127之间的整数值。这就是溢出的原因(要保持128,需要符号的第九位)。任何时候,一个有符号值的最高有效位为1时,它都表示一个负数,因此为了将一个像0b10000000这样的数字放入一个字节,您需要在文本中表示一个负数。例如,值-128相当于int 0b11111111110000000,因此您需要将其用作文本,或者更简单地说,只需将其显式转换为字节,如:(byte)0b10000000

@jprofitt:Oh。Snap,你就在那里。那个可能会改变答案。。。我得读一读。事实上,我现在更糊涂了。根据语言规范,没有字节文字。所以这两种情况都不应该奏效…@JohannesH:Java 7中引入了二进制文本。所以在较低版本中,它们将不可用。@JohannesH。那不应该是“附加L”而不是“前置L”?明白你的意思了。“Java中没有字节文字。有int文字和long文字。”这让我完全理解了整个过程。在two的恭维表示法中,0b10000000是-128,在Java中仍然在int的范围内。对,但您试图生成一个字节,因此出现了错误。类型字节不能保存值0b10000000+1,我同意,这必须是答案。添加了更多细节,请看我的答案。是的,是缺少二进制文本导致了这个问题+1我仍然不明白为什么一个字节不能保存0b10000000的值?它是8位。它应该代表一些价值,对吗?为什么溢出?
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