虽然这是一个非常初级的问题,但我发现它很复杂。其实我想知道幕后发生的事情?为什么Character.MAX_VALUE不会打印char的最大值(65535)和MAX_VALUE-1的最大值。
System.out.println("Byte Max Value: "+Byte.MAX_VALUE);//print 127 Ok!
System.out.println("Character Max Value: "+Character.MAX_VALUE);//print ?(Question Mark)
System.out.println(Character.MAX_VALUE-1);//print 65534
答案 0 :(得分:7)
因为在第二行中,Character.MAX_VALUE
与String连接。
正如JLS所述:
字符串连接运算符+(第15.18.1节),当给出a时 字符串操作数和积分操作数,将转换积分 操作数到String表示其十进制形式的值,然后 生成一个新创建的String,它是两者的串联 字符串
由于Character.MAX_VALUE
不可打印,因此您看不到它。
在第三种情况下,你用int
进行减法,因此整个表达式被转换为int
,并打印出int
值。
同样如JLS所述:
二进制+运算符在应用于两个操作数时执行加法 数字类型,产生操作数的总和。
[...]
对操作数执行二进制数字提升(第5.6.2节)。
当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则适用:
[...]
- 醇>
应用扩展基元转换(第5.1.2节)来转换或 两个操作数由以下规则指定:
如果任一操作数的类型为double,则另一个操作数转换为double。
否则,如果任一操作数的类型为float,则转换另一个操作数 漂浮。
否则,如果任一操作数的类型为long,则转换另一个操作数 很久。
否则,两个操作数都将转换为int 。
如果你已经完成了
System.out.println("Character Max Value: "+(Character.MAX_VALUE+0));
会打印Character Max Value: 65535
答案 1 :(得分:3)
Character.MAX_VALUE是\ uFFFF。根据定义,这不是可打印的字符。当您执行-1或+1之类的操作时,您将类型更改为int
答案 2 :(得分:0)
将
0
添加到Character.MIN_VALUE
或Character.MAX_VALUE
进行隐式投射效果很好 您还可以显式转换为int,以使用两个MIN_VALUE
方法获取MAX_VALUE
和println()
....System.out.println("char min. value: " + (int)Character.MIN_VALUE);
System.out.println("char max. value: " + (int)Character.MAX_VALUE);
在你的第三行你有...
System.out.println(Character.MAX_VALUE-1);//print 65534
您基本上是将Unicode最大值隐式转换为int,然后从该最大值中减去1。在Unicode格式中,范围从U+0000
到U+FFFF
,FFFF
(65535
)是char原始数据类型的数字上限范围,0000
(0
)是char数据类型的数字下限。在上面的两个println()
方法中,Character
类是char
原始数据类型的包装类,它只需要原始char
并将其包装起来Character
课程。Character
。允许我们将其视为对象,并允许我们访问MIN_VALUE
包装类的字段和方法。
然后使用点运算符使用MAX_VALUE
和0
字段,我们可以将这些Unicode值转换为int' s,输出是以十进制数表示的范围65535
到{{ 1}}
当然,可以理解的是,如果可以隐式地投射某些东西,也可以明确地投射它 我们也只考虑基本多语言平面(平面0)。通常,通过编写"U+"
后跟其四位十六进制数来引用Unicode代码点。因此,平面0中的这些代码点由四位十六进制数表示,没有任何困难。 Unicode代码点只不过是四位十六进制数。平面0
可以表示一系列65535
个可能的字符。维基百科有一篇关于Unicode的好文章。