工作一段时间后,返回来看java基础教程。却遇到了个问题。没有详细深入了解,贴出来大家讨论下。
基本数据类型中,char都知道,占有的字节为1。表示范围为:0——255。
上面的知识相信很多人都知道的。
下面是我写的简单测试代码:public class test{
public static void main(String args[]){
char ch1= '我';
int ch2=ch1;
System.out.println("ch1 = "+ch1);
System.out.println("ch2 = "+ch2);
}
}输出的结果为:
C:\>java test
ch1 = 我
ch2 = 25105
请问这个是怎么回事呢?
基本数据类型中,char都知道,占有的字节为1。表示范围为:0——255。
上面的知识相信很多人都知道的。
下面是我写的简单测试代码:public class test{
public static void main(String args[]){
char ch1= '我';
int ch2=ch1;
System.out.println("ch1 = "+ch1);
System.out.println("ch2 = "+ch2);
}
}输出的结果为:
C:\>java test
ch1 = 我
ch2 = 25105
请问这个是怎么回事呢?
char 是2 byte。。
去年学的时候,完全不去离那些int,char什么的多少字节
因为char类型是8位(-128到127),而int是32位,所以编译器会提示警告比如,你把一个int类型值256,赋给一个char类型,则赋值后变成了0
这是因为256的二进制是100000000(9位)
而char只有8位,所以赋值时就取二进制的低八位,也就是00000000
所以结果就是0
6楼提出“因为char类型是8位(-128到127),而int是32位,所以编译器会提示警告”。
这个是怎么理解的呢?以前面试的时候有这样一个题目:
英文汉字综合的一个String字符串。任意截取的时候怎样控制不会截取汉字的一半。
可我写test的时候就发现,根本不用考虑。想怎样取就怎样取。这又是怎么回事呢?这个也关系到char问题。
待高手指教。
至于你那种情况
我一一解释给你听:
第一次输出了‘我’是吧?是由于一个字符占了俩个字节所以采用char类型才能够输出,否则如果是一个字节的话,输出的应该你没学过的陌生东东,而第二次你用int实际上是对char进行了造型,即强制转换,又因为在java中char是无符号的,而int是有符号的,因此从无符号转至有符号就会出现一个问题,就会转化为int类型所能表示的一个最大值,如果楼主不信,你把字符换成别的字符试试,第二次输出的应该还是同样的结果,虽然俩次字符不同
char ch1= '我';
int ch2=ch1;System.out.println("ch1 = "+ch1); //ch1是char类型,这句调用的是
PrintStream:
public void print(char c) {
write(String.valueOf(c));
}
String:
public static String valueOf(char c) {
char data[] = {c};
return new String(0, 1, data); // char c所表示的unitcod字符
}System.out.println("ch2 = "+ch2); //ch2是int类型,这句调用的是
PrintStream:
public void print(int i) {
write(String.valueOf(i));
}
String:
public static String valueOf(int i) {
return Integer.toString(i, 10); //10进制的整数。
}
看源码一切就明了了,不知楼主明了了么?
你的println的源码说明了什么问题?
不好意思,看题不仔细,忽视了"ch1 = "+ 这个字符串连接操作。最后都调用的是printl(String).关键在StringBuilder的append()方法的调用。char调用的是append(char), int调用的是append(int);
为什么是StringBuilder的append。应为 不是编译期常量的String的+操作,编译器用StringBuilder做了优化。比如 String s1 = "a"; int i = 10; String s2 = s1 + i;
最后一句优化为:
String s2;
StringBuilder sb = new Stringbuilder();
sb.appedn(s1);
sb.append(i);
s2 = sb.toString();其实看调用不同参数的pringln一样的。println的源码说明的问题:
System.out.println(25105); //为什么这句输出是“25105”
System.out.println((char)25105); // 为什么这句输出是“我”明白了么?
(百度)Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。为什么要对字符编个二进制数字,是因为计算机只识别由0、1组成的代码,所以要用个数字来表示字符。而二进制、十进制、十六进制等是常用的数字表示形式,它们之间如何相互转换,就不说了;Java中字符串(String)、字符(char) 用的是Unicode;并且char的字节长度是2个字节;
如果怀疑char是一个字节,你的例子就是一个反例,'我'这个字符的十进制是25105,明显大于一个1个字节的表示范围;那么为什么'我'的十进制是25105?'我'这个字符在Unicode的代码表中用6211这个十六进制数表示的,这里是下载Unicode代码表:
http://www.unicode.org/charts/PDF/U4E00.pdf
翻到第129页左起倒数第3行就是'我'字符的十六进制编码。6211(十六进制)转换为十进制数是25105,而Java中int是占4个字节的,完全能容纳下char字符。
所以当把'我'字符转换为int时就是25105了,但25105在char中表示的是字符'我';为什么,Unicode这么规定的。
ch2 = 25105处理已完成。
这就是运行的结果。
public static void main(String args[]){
char ch1= '我'; //这个是字符型
int ch2=ch1; //这个是整型
System.out.println("ch1 = "+ch1);
System.out.println("ch2 = "+ch2);
}
}
“我”在java中表示字符 所以输出ch1 就是输出“我”
ch2 是整型 ch2=ch1 传送给ch2的不是“我”而是“我”的ASCII码
1.char类型可以存一个字符吗,为什么?