问题描述
谁能解释一下这个,它可以在控制台输出一个汉字。char最大的承受范围不是65535吗?这都超到哪去了?竟然还可以?还是我的理解char不能表示65535以上数字的理解有误?
解决方案
解决方案二:
你这里的165573代表的是一个汉字,不是长度,代表的这个汉字的长度还在char的长度范围之内。查阅了一些资料,我是这样理解的。
解决方案三:
不是长度?那怎么才代表长度呢?
解决方案四:
>>谁能解释一下这个,它可以在控制台输出一个汉字。确实可以输出一个汉字【蛅】,这个字的Unicode编码为【U+86C5】,用十进制表示为【U+34501】>>char最大的承受范围不是65535吗?在Java中,char最大的取值范围是65535>>这都超到哪去了?【U+34501】并没有超过【65535】>>竟然还可以?因为【(char)165573】把原来的大的数据【165573】在数据类型转换的过程中给自动截短了System.out.println((char)165573);相当于System.out.println(34501);>>还是我的理解char不能表示65535以上数字的理解有误?这个理解没有问题packagetopics_390899834;publicclassCharTest{publicstaticvoidmain(String[]args){PrimitiveTypeSizeMinMax.print();System.out.println((char)165573);System.out.println((char)(165573-2*(1+(int)Character.MAX_VALUE)));//34501}}classPrimitiveTypeSizeMinMax{//publicstaticvoidmain(String[]args){publicstaticvoidprint(){//BooleandoesnothaveBoolean.SIZE,Boolean.MIN_VALUE,orBoolean.MAX_VALUEdisplaySizeMinAndMax(Byte.TYPE,Byte.SIZE,Byte.MIN_VALUE,Byte.MAX_VALUE);displaySizeMinAndMax(Short.TYPE,Short.SIZE,Short.MIN_VALUE,Short.MAX_VALUE);displaySizeMinAndMax(Character.TYPE,Character.SIZE,(int)Character.MIN_VALUE,(int)Character.MAX_VALUE);displaySizeMinAndMax(Integer.TYPE,Integer.SIZE,Integer.MIN_VALUE,Integer.MAX_VALUE);displaySizeMinAndMax(Long.TYPE,Long.SIZE,Long.MIN_VALUE,Long.MAX_VALUE);displaySizeMinAndMax(Float.TYPE,Float.SIZE,Float.MIN_VALUE,Float.MAX_VALUE);displaySizeMinAndMax(Double.TYPE,Double.SIZE,Double.MIN_VALUE,Double.MAX_VALUE);}publicstaticvoiddisplaySizeMinAndMax(Class<?>type,intsize,Numbermin,Numbermax){System.out.printf("type:%-6ssize:%-2smin:%-20smax:%sn",type,size,min,max);}}
输出:type:bytesize:8min:-128max:127type:shortsize:16min:-32768max:32767type:charsize:16min:0max:65535type:intsize:32min:-2147483648max:2147483647type:longsize:64min:-9223372036854775808max:9223372036854775807type:floatsize:32min:1.4E-45max:3.4028235E38type:doublesize:64min:4.9E-324max:1.7976931348623157E308蛅蛅
解决方案五:
【蛅】这个汉字相关的信息如下:http://baike.baidu.com/view/1734265.htm?fr=aladdin
解决方案六:
165573转换为16进制是286C5,如果转换为char类型,则取后16位为86C5,即蛅。
解决方案七:
楼上大神都是正确答案你强制转换了当然就可以
解决方案八:
引用5楼rumlee的回复:
165573转换为16进制是286C5,如果转换为char类型,则取后16位为86C5,即蛅。
楼主就是只看了System.out.println((char)165573);
的输出,却忘记了看System.out.println(String.valueOf((int)(char)165573));
解决方案九:
char是2个B,int是4个B,(char)只剩后面2个B!
解决方案十:
publicclassTest{publicstaticvoidmain(String[]args){inti=165573;System.out.println("十进制表示"+i);Stringb=Integer.toBinaryString(i);System.out.println("二进制表示"+b);Stringb16=b.substring(b.length()-16,b.length());System.out.println("二进制的后16位"+b16);BigIntegerbi=newBigInteger(b16,2);System.out.println("二进制的后16位对应的10进制"+bi.toString());Stringh=Integer.toHexString(Integer.parseInt(bi.toString()));System.out.println("二进制的后16位对应的16进制"+h);System.out.println((char)i);System.out.println((char)Integer.parseInt(bi.toString()));}}
输出结果:十进制表示165573二进制表示101000011011000101二进制的后16位1000011011000101二进制的后16位对应的10进制34501二进制的后16位对应的16进制86c5蛅蛅
JAVA中char占两个字节(16位),所以超出16位的部分在强制转换的时候被遗弃,剩下的16位的十六进制为86c5,查看unicode编码表如下:
解决方案十一:
不好意思上面的图接错了,上面扩起来的是86c4
解决方案十二:
哇,都是大神,我都不敢班门弄斧啦