Java 整数到较小字符的内部转换
在下面的程序中,我将整数数据类型分配给char数据类型Java 整数到较小字符的内部转换,java,c#,.net,types,Java,C#,.net,Types,在下面的程序中,我将整数数据类型分配给char数据类型 public static void main(String args[]) { char ch =65; System.out.println(ch); } 我知道int占32位,char占16位。有了这些知识,我希望编译器抛出一个错误消息“尝试将较大大小的数据转换为较小大小的数据” 为什么编译器没有抱怨并在内部将输出转换和打印为“A”(我知道它是65的ASCII等价物,我的问题只与数据类
public static void main(String args[]) {
char ch =65;
System.out.println(ch);
}
我知道int占32位,char占16位。有了这些知识,我希望编译器抛出一个错误消息“尝试将较大大小的数据转换为较小大小的数据”
为什么编译器没有抱怨并在内部将输出转换和打印为“A”(我知道它是65的ASCII等价物,我的问题只与数据类型的大小有关)Java关于将
int
转换为char
的一般规则有一个例外。如果int
是一个编译时常量表达式(例如文字),并且表达式的int
值在要求的范围内(0到65535),则将int
表达式指定给char
是合法的
直观地说,对于编译时常量表达式,编译器知道是否可以在不丢失信息的情况下分配表达式值
这包括在。。。在以“此外,如果表达式是常量表达式…”开头的段落中,编译器实际上验证了范围。这是因为
int 65
在预期范围内
无法编译以下内容:
char c = (int)Character.MAX_VALUE + 1
char c = 65536
这将和你的任务一样:
char c = 65535 //Within range
但是,当值在编译时不是常量时,需要强制转换:
private static void charRange(int i) {
char c = (char) i;
System.out.println(" --> " + (int) c);
}
charRange(65);
charRange(Character.MAX_VALUE + 20);
而且支票没有发生(为溢出腾出空间)
-->六十五
-->19
Java或C#等编程语言附带一组整数。每种类型都有一个明确定义的范围,形式为[最小值,最大值]。这些值存储在从最高有效位到最低有效位的固定位序列中 例如,让十进制数123456表示下一个32位序列 00000000000000 11110001001000000 当您尝试将32位数字类型转换为16位数字类型时,编译器将复制16个最低有效位(或最后16位),然后将123456数字包装为 1110001001000000 如果你把这个二进制数转换成十进制数,它是57920。正如您所意识到的,32位数字不能放入16位序列,原始序列被任意包装。这称为,当您将2个数字相加或相乘时,也会发生这种情况,其结果超出整数类型范围的界限
作为程序员,您应该注意溢出,并对此作出反应以避免程序失败。您还应该阅读有关的详细信息。编译器会抱怨的int在哪里?在编译时,它知道65将适合您的字符。问问自己1000001需要多少位?在类型转换之后,如果我调用charRange(65536);char c=(char)i如何存储此值?它是否会转换为字符范围内的数字,比如65535?@user1400915它将溢出并环绕。查看第二个示例调用
charRange(Character.MAX_值+20)
,这导致了意外的值19
。为什么值总是19,它是有特定的模式还是只是一个随机数?@user1400915这与其他数字类型溢出时的行为相同,尽管char
的范围是0-65535
。你可以在这篇文章中找到关于溢出/下溢的信息: