Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将负字节分配给自身_Java_Byte_Signed_Primitive Types_Type Mismatch - Fatal编程技术网

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
    char
    ,则通过扩大原语转换(§5.1.2)将其提升为
    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。谢谢大家提供的信息性回复。我很感激。