根据Java标准,short和char类型都使用2个字节,因此当我编写类似的东西时
char ch = 'c';
short s = ch;
Run Code Online (Sandbox Code Playgroud)
有一个错误说"可能会失去精确度".我在这里缺少什么
编译器的某些功能让我感到困惑(使用Eclipse的Oracle JDK 1.7).
所以我有这本书说char原语需要明确地转换为short和byte,这一切都有意义,因为数据类型的允许范围不重叠.
换句话说,下面的代码可以工作(但如果没有显式类型转换,则无法工作):
char c = '&';
byte b = (byte)c;
short s = (short)c;
Run Code Online (Sandbox Code Playgroud)
正确打印b或s会显示数字38,这是Unicode中(&)的数字等效值.
这让我想到了我的实际问题.为什么以下工作也一样?
byte bc = '&';
short sc = '&';
System.out.println(bc); // Correctly displays number 38 on the console
System.out.println(sc); // Correctly displays number 38 on the console
Run Code Online (Sandbox Code Playgroud)
现在我肯定会理解以下内容(也适用):
byte bt = (byte)'&';
System.out.println(bt); // Correctly displays number 38 on the console
Run Code Online (Sandbox Code Playgroud)
但是对于字节(和短)"潜行转换"这个无编译器警告字符对我来说似乎不对.
有人可以解释,为什么允许这样做?
原因可能在于对'<char>'自身的解释,因此它实际上并没有达到char原始状态,而是作为数字(八进制或十六进制等)值处理?
你不能从int转换为char,所以这是非法的
int i = 88; char c = i;,
但是这是允许的char c = 88;.
不是简单的数字和int文字吗?怎么允许这个?
缩小转换是指将可以保存较大值的数据类型放入可以保持最大值较小的数据类型.
long l = 4L;
int i = (int)l;
Run Code Online (Sandbox Code Playgroud)
但是我不明白为什么一个char的缩写是一个缩小的转换,但我有直觉它与这两种数据类型的有符号/无符号有关但我无法解释原因.
short s = 4; // short max value is 32767
char c = (char)s; // char max value is 65535
Run Code Online (Sandbox Code Playgroud)
它看起来像是一个扩大的转换,或者至少既不缩小也不扩宽,因为它们都是16位并且可以保持相同数量的值.
System.out.println((int)Character.MIN_VALUE); //0
System.out.println((int)Character.MAX_VALUE); //65535
System.out.println(Short.MIN_VALUE); //-32768
System.out.println(Short.MAX_VALUE); //32767
//65535 = 32768+32767
Run Code Online (Sandbox Code Playgroud) public class CharAndIntTest {
public static void main(String[] args) {
char i='1';
int ii=65;
i=ii;
}
}
Run Code Online (Sandbox Code Playgroud)