为自己分配一个负字节

时间:2015-01-24 18:23:40

标签: java byte signed primitive-types type-mismatch

我正面对这行代码。

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

所以b现在是98.但是现在第二行给出了类型不匹配错误(无法从int转换为byte)。 这是为什么?我四处阅读,听到很多"所有字节都已签名"但我仍然没有得到它。 非常感谢您的全面答复。

4 个答案:

答案 0 :(得分:2)

一元减号将操作数扩展为int。来自JLS

  

<强> 15.15.4。一元减法运算符-

     

对操作数执行一元数字提升(第5.6.1节)。

     

<强> 5.6.1。一元数字促销

     

某些运算符将单一数字提升应用于单个操作数,该操作数必须生成数值类型的值:

     
      
  • ...

  •   
  • 否则,如果操作数是编译时类型byteshortchar,则会将其提升为类型int的值扩展的原始转换(第5.1.2节)。

  •   

要将结果分配回b,您需要明确地将其转换为byte

    b = (byte)-b;

答案 1 :(得分:1)

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

答案 2 :(得分:1)

起初,这似乎令人费解:

b = 'b';

采用更宽的类型char,它在内存中占用2个字节,并将其放入单个字节中。这不应该工作。但确实如此。

b = -b;

取一个负字节并将其放入一个字节。这应该有效,但它没有。

b = 'b'成功的原因实际上是'b'是一个常量表达式。因此,编译器识别出它不会溢出单个字节,因此允许分配。如果,而不是那样,你写了:

char c = 'b';
byte b = c;

这会失败,因为c不再是常量表达式。

第二次分配失败的原因已在其他答案中向您解释。只要将-运算符应用于某个字节,结果就是int。一旦发生这种情况,再次,你不能把它放在一个字节中,因为int需要4个字节。但你可以施展它。

答案 3 :(得分:-2)

Java中的一个字节是无符号整数类型,其有效值范围为0到255.当您进行否定赋值时,例如b = -b,右侧被转换为整数,以便发生否定。

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