Java 将负字节分配给自身
我面对的是这一行代码Java 将负字节分配给自身,java,byte,signed,primitive-types,type-mismatch,Java,Byte,Signed,Primitive Types,Type Mismatch,我面对的是这一行代码 byte b='b'; b=-b; b现在98岁了。但现在第二行给出了一个类型不匹配错误(无法从int转换为byte)。 为什么呢?我到处阅读,听到很多“所有字节都有符号”,但我还是不明白。 如果您能给出完整的答案,我们将不胜感激。一元运算符可以执行类型转换。如果操作数的类型是byte、short或char,则该操作会在计算值的算术求反并生成int值之前将操作数转换为int值 从这里开始:一元负号将操作数加宽到int。从: 15.15.4。一元减号运算符- 对操作数执行一
byte b='b';
b=-b;
b现在98岁了。但现在第二行给出了一个类型不匹配错误(无法从int转换为byte)。
为什么呢?我到处阅读,听到很多“所有字节都有符号”,但我还是不明白。
如果您能给出完整的答案,我们将不胜感激。
一元运算符可以执行类型转换。如果操作数的类型是byte、short或char,则该操作会在计算值的算术求反并生成int值之前将操作数转换为int值
从这里开始:一元负号将操作数加宽到
int
。从:
15.15.4。一元减号运算符-
对操作数执行一元数字提升(§5.6.1)
5.6.1。一元数字促销
某些运算符对单个操作数应用一元数字提升,该操作数必须生成数字类型的值:
- 否则,如果操作数是编译时类型
、byte
或short
,则通过扩大原语转换(§5.1.2)将其提升为char
类型的值int
b
,需要将其显式转换为字节
:
b = (byte)-b;
起初,这似乎令人费解:
b = 'b';
采用较宽的类型char
,它在内存中占用2个字节,并将其放入一个字节。这不应该起作用。但确实如此
b = -b;
获取一个负字节并将其放入一个字节中。这应该行得通,但不行
b='b'
之所以成功,实际上是因为'b'
是一个常量表达式。因此,编译器确定它不会溢出单个字节,因此允许赋值。如果你写的不是这个,而是:
char c = 'b';
byte b = c;
这将失败,因为c
不再是一个常量表达式
第二次作业失败的原因已在其他答案中向您解释。只要对字节应用
-
运算符,结果就是int
。一旦发生这种情况,您就不能将其放在一个字节中,因为int
需要4个字节。但是您可以强制转换它。Java中的字节是无符号整数类型,有效值范围为0到255。当您进行求反赋值时,例如b=-b,右边将转换为整数,以便进行求反
因此,在转换之后,您将把一个有符号整数赋值给一个只能保存0到255之间的值的变量,该整数的值可以是-2147483648到2147483647。编译器告诉您进行此赋值将失去精度,因为它必须丢弃位才能将数字强制设置为0到255范围。哪种编程语言?(
byte
在大多数情况下是无符号的,因此您可能正在经历类型升级)。byte b='b'
不是有效的Java本地或字段声明。我有点想了解这个问题,所以如果答案可以提供信息,同时也不太复杂,那将是令人惊讶的事情。它很有效。如果我注释掉b=-b并打印出b,则值为98。谢谢大家提供的信息性回复。我很感激。