工作一段时间后,返回来看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
    请问这个是怎么回事呢?

解决方案 »

  1.   

    char在java中是以 两字节表示且非负,所以可以取的范围是0~65535(十六进制为0~OxFFFF)
      

  2.   

    = =!Unicode-16
    char 是2 byte。。
      

  3.   

    额,我也是前段时间才发现中文可以。
    去年学的时候,完全不去离那些int,char什么的多少字节
      

  4.   

    char是unicode类型的字符双字节
      

  5.   

    你把一个const int类型的值,赋给了一个char类型变量。
    因为char类型是8位(-128到127),而int是32位,所以编译器会提示警告比如,你把一个int类型值256,赋给一个char类型,则赋值后变成了0
    这是因为256的二进制是100000000(9位)
    而char只有8位,所以赋值时就取二进制的低八位,也就是00000000
    所以结果就是0
      

  6.   

    char 占有字节1。标识范围:0-255。这个结果是我在java基础教程中看到的。
    6楼提出“因为char类型是8位(-128到127),而int是32位,所以编译器会提示警告”。
    这个是怎么理解的呢?以前面试的时候有这样一个题目:
    英文汉字综合的一个String字符串。任意截取的时候怎样控制不会截取汉字的一半。
    可我写test的时候就发现,根本不用考虑。想怎样取就怎样取。这又是怎么回事呢?这个也关系到char问题。
    待高手指教。
      

  7.   

    楼主: char 在java中是占俩个字节的,并不是您所说的占一个字节
    至于你那种情况
    我一一解释给你听:
    第一次输出了‘我’是吧?是由于一个字符占了俩个字节所以采用char类型才能够输出,否则如果是一个字节的话,输出的应该你没学过的陌生东东,而第二次你用int实际上是对char进行了造型,即强制转换,又因为在java中char是无符号的,而int是有符号的,因此从无符号转至有符号就会出现一个问题,就会转化为int类型所能表示的一个最大值,如果楼主不信,你把字符换成别的字符试试,第二次输出的应该还是同样的结果,虽然俩次字符不同
      

  8.   

    额……java里char是unicode码……是2字节……
      

  9.   

    java中char两个字节
      

  10.   



    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进制的整数。
        }
    看源码一切就明了了,不知楼主明了了么?
      

  11.   

    如果将汉字我改为其他的字符结果也不一样!但Java里的char的确还是占两个字节的!
      

  12.   


    你的println的源码说明了什么问题?
      

  13.   


    不好意思,看题不仔细,忽视了"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); // 为什么这句输出是“我”明白了么?
      

  14.   

    楼主的不明白,是对Java中字符编码的不理解;下面简单的说下这个是怎么回事:
    (百度)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这么规定的。
      

  15.   

    ch1 = 我
    ch2 = 25105处理已完成。
    这就是运行的结果。
                
      

  16.   

    public class test{
        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码
      

  17.   

    遇到另外一个问题:
    1.char类型可以存一个字符吗,为什么?