如果你声明类型为byte或short的变量,并尝试对它们执行算术运算,你会收到错误信息“Type mismatch: cannot convert int to short”(或相应地“Type mismatch: cannot convert int to byte”)。
byte a = 23;
byte b = 34;
byte c = a + b;
在这个示例中,编译错误出现在第三行。
如果你声明类型为byte或short的变量,并尝试对它们执行算术运算,你会收到错误信息“Type mismatch: cannot convert int to short”(或相应地“Type mismatch: cannot convert int to byte”)。
byte a = 23;
byte b = 34;
byte c = a + b;
在这个示例中,编译错误出现在第三行。
byte a = 23; byte b = 34; byte c = (byte) (a + b);这里有一个关于真正的Java大师的后续问题:为什么?类型byte和short是完全可以的数字类型。为什么Java不允许直接对这些类型进行算术运算?(答案不是"精度损失",因为首先没有明显的理由将其转换为int。)
byte c = (byte)(a + b)
将变成byte c = 57
,其中57是byte类型。但是,由于数值提升规定所有的byte、short和char字面量都会被转换为int,因此这个byte 57会被提升为int 57。所以从这个意义上讲,编译器应该仍然会报错,但它没有。为什么呢? - user12208242a + b
其中a和b的类型为byte。这是一种简写形式:
(int)a + (int)b
这个表达式的类型是int。当将int值赋给byte变量时,显然会出现错误。
为什么语言要以这种方式定义呢?假设a是60,b是70,则a+b为-126 - 整数溢出。作为预期结果为int的更复杂表达式的一部分,这可能会成为一个难以解决的错误。限制使用byte和short只用于数组存储、文件格式/网络协议的常量和谜题。
JavaPolis 2007有一个有趣的录音。詹姆斯·高斯林(James Gosling)举了一个关于无符号算术有多么复杂(以及为什么它不在Java中)的例子。乔希·布洛赫(Josh Bloch)指出,在正常的有符号算术下,他的例子也给出了错误的示例。为了进行可理解的算术运算,我们需要任意精度。