我已阅读本网站上关于类型转换的大部分主题(请不要将我链接到任何其他内容或将其标记为副本),并希望对其中一些具体案例进行解释。
1)
char x='a';
char y = 'b';
在这种情况下,我们不允许这样做
char z = x + y; \\case 1a
但我们可以做到
char z='a'+'b'; \\ case 1b
我在这个网站上看到,添加两个字符会产生一个int,这就是为什么我们不能做1a,但如果是这样,为什么我们可以做1b。
2)
为什么允许这样做
byte byteVar = 42;
文字42是一个int,所以为什么我们允许将它存储在一个字节中而不进行转换,即使42在字节范围内。如果可以做到这一点,为什么不能做到。
3) 以下返回true
System.out.println(6.0000000000000000000000000000000001 == 6.0);
RHS被视为双字母。我猜测LHS也被视为文字双,但它绝对超过了双精度所允许的精度。为什么不抛出错误,比较两件事情。
我非常感谢任何指导。谢谢。
答案 0 :(得分:1)
前两个由同一个案件处理 - JLS section 5.2:
此外,如果表达式是字节类型
short
,char
或int
的常量表达式(第15.28节):
- 如果变量的类型是
byte
,short
或char
,则可以使用缩小的基元转换,并且常量表达式的值可以在类型中表示。变量
第三种情况只是从源代码中的文字到double
的常规转换:最接近的确切double
到6.0000000000000000000000000000000001是6.0。所以如果你有:
double d = 6.0000000000000000000000000000000001;
将值6.0分配给d
,因为它是与源代码中指定的值最接近的可表示double
。