Java 整数到较小字符的内部转换

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等价物,我的问题只与数据类

在下面的程序中,我将整数数据类型分配给char数据类型

    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
。你可以在这篇文章中找到关于溢出/下溢的信息: