当我在做Integert.valueOf('a')时 返回97是char a的ASCII值。
我想知道char在valueOf方法中转换为ascii值的时间是什么?
答案 0 :(得分:1)
char
是数字类型。您正在调用Integer.valueOf(int i)
方法,该方法需要int
。通过零扩展将char
从16位提升到32位,并将该值传递给valueOf
方法。
请注意,这里几乎肯定不涉及ASCII。大多数Java编译器(如Oracle javac
引用编译器)在解析源代码时将使用平台默认字符集(如Windows-1252),而Java内部使用Unicode。但是,ASCII是这两个字符集的子集,Unicode代码点97 LATIN SMALL LETTER A对这三个字符集都是通用的。
我意识到将代码点称为“ASCII值”是很常见的,但是如果试图说出希腊字母的“ASCII值”,则会导致混淆。除非你实际上在谈论US-ASCII字符集,否则最好说“代码点”。
答案 1 :(得分:1)
您发生的是内部类型转换。
所以你的代码等同于:
char a = 'a';
int aint = (int)a;
Integer aInteger = Integer.valueOf(aint);
System.out.println(aInteger.toString());
引用oracle java教程:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
char:char数据类型是一个16位Unicode字符。它的最小值为' \ u0000' (或0)和' \ uffff'的最大值(或65,535包括在内)。
因此,变量a保持了与字符相同的unicode' a' (97)
然后发生的是扩大操作 https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html
5.1.2。扩大原始转换
[...]
将字符的扩展转换为整数类型T零扩展char值的表示以填充更宽的格式。
所以你的char(16位)将被扩展为int(32位)。
那个int正在进入Integer.valueOf()
希望回答你的问题。
托比