Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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 为什么字节+;=1编译,但字节=字节+;1不是吗?_Java_Types - Fatal编程技术网

Java 为什么字节+;=1编译,但字节=字节+;1不是吗?

Java 为什么字节+;=1编译,但字节=字节+;1不是吗?,java,types,Java,Types,如果我有一个字节变量:byte b=0 为什么以下方法有效: b++; b += 1; // compiles 。。。但事实并非如此 b = b + 1; // compile error 编译器是否首先理解为字节,然后理解为int [编辑] 我知道选角,但我想提请大家注意b++,b++=1和b=b+1 我认为他们是平等的,那么为什么他们不同呢?两者的区别是什么 b += 1 and b = b + 1 ? 是的,+-操作的结果是int,因此需要强制转换才能将其分配给

如果我有一个字节变量:
byte b=0

为什么以下方法有效:

   b++;
   b += 1; // compiles
。。。但事实并非如此

   b = b + 1; // compile error
编译器是否首先理解为
字节
,然后理解为
int

[编辑]

我知道选角,但我想提请大家注意
b++,b++=1和b=b+1

我认为他们是平等的,那么为什么他们不同呢?两者的区别是什么

  b += 1 and b = b + 1 ?

是的,
+
-操作的结果是
int
,因此需要强制转换才能将其分配给
字节
变量。

可能的精度损失是问题所在。投下它就可以了

b = (byte) (b + 1);

您需要强制转换为字节:

b = (byte) (b + 1);

因为
b+=1
相当于
b=(字节)(b+1)
,而
b+1
的类型被提升为
int
(),因此其结果不能在没有显式转换的情况下分配给
byte

发件人:

形式为E1 op=E2的复合赋值表达式等价于E1=(T)((E1)op(E2)),其中T是E1的类型,但E1仅计算一次


执行
b+1
操作会将结果扩大到整数,而重新分配到字节b将导致精度损失。解释:。但是我更喜欢axtavt的答案。

在java中,整数的默认值是int,浮点数的默认值是double。因此,默认情况下,
b
被转换为整数以执行该操作。因此,结果答案需要在存储之前进行打字,以防止任何可能的精度损失。但是
b+=1
会自动执行。

我不相信精度损失的说法,因为编译器在处理整数和长整数时不会以类似的方式保护您。 我认为,真正的答案在于JLS对INT的支持比字节更好,如本答案所述:

byte和short类型的操作数在交给运算符之前会自动升级为int

所以当你做字节b=b+1时;
当对字节值执行操作时,它将其视为“int”。为了避免这种情况,我们使用b+=1;在这里,它被自动键入字节

你的答案没什么好笑的:)操作符实际上确保了编辑部分的int部分:
byte b=0;b+=333这没问题。b+=1的编译方式与b=(字节)(b+1)的编辑方式类似。我知道casting可以解决这个问题,但我想学习编辑部分编写的其他东西,有没有一种方法可以编写一个数值常量,从而将其视为一个字节?如果我写7F,它被视为一个浮点,7L是一个长的,以此类推。像7B这样的东西会被视为一个字节吗?@BigMac66,
static final byte C1=11;//这是一个字节,但仍然添加C1+C1不是一个字节,但静态最终字节C2=C1+C1是正确的(b/c它是由编译器而不是运行时计算的),从C1中删除
final
,这是一个错误。我明白了,我要问的是,当你写一个原语常量值时,你可以附加一个字母来指定你想要的常量类型,字节原语有一个字母吗?到目前为止,我只能找到L(long)、D(double)和F(float)-还有其他后缀吗?@BigMac66:没有其他后缀,也许它们也没有必要,因为“int”类型的编译时常量可以在必要时隐式转换为更窄的类型。答案是正确的,但我仍然不喜欢这种解释。如果可能的精度损失是这里的一个有效原因,那么同样的情况也应该禁止用于整数。毕竟,
Integer.MAX_VALUE+1
也有同样(或类似)的问题。你是对的。编译器使用字节比使用整数更好地保护您:b=127;对于编译器来说是可以的,而b=128;不是并且必须在它给出正确的-128值之前进行铸造。整数则不然。另一方面,你可以说int i=2147483647;它是Integer.MAX_值,如果你向上一个int,i=2147483648;确实会出现编译器错误“整数太大”。我认为axtavt很好地解释了这种情况。对于字节,我们有一个int not的提升。