给自己分配一个负字节

Assigning a negative byte to itself

我正面临这行代码。

byte b='b';
b=-b;

所以 b 现在是 98。但是现在第二行给出了类型不匹配错误(无法从 int 转换为 byte)。 这是为什么?我四处阅读,听到了很多 "all bytes are signed" 但我还是不明白。 将不胜感激。

The unary - operator may perform a type conversion. If the type of the operand is byte, short, or char, the operation converts the operand to an int before computing the value's arithmetic negation and producing an int value

取自此处:http://oponet.stsci.edu/web/documentation/Java%20Reference%20Library%201.02/langref/ch04_04.htm

一元减号将操作数加宽为 int。来自 JLS:

15.15.4. Unary Minus Operator -

Unary numeric promotion (§5.6.1) is performed on the operand.

5.6.1. Unary Numeric Promotion

Some operators apply unary numeric promotion to a single operand, which must produce a value of a numeric type:

  • ...

  • Otherwise, if the operand is of compile-time type byte, short, or char, it is promoted to a value of type int by a widening primitive conversion (§5.1.2).

要将结果分配回 b,您需要将其显式转换为 byte:

    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,右手边被转换为一个整数,以便进行取反。

因此,在该转换之后,您将一个有符号整数(其值可以从 -2,147,483,648 到 2,147,483,647)分配给一个只能保存 0 到 255 之间的值的变量。编译器告诉您,您将丢失通过进行此分配来提高精度,因为它将不得不丢弃位以将数字强制到 0 到 255 范围内。