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的提升。