2016-10-04 76 views
2
public static void main(String... args){ 
     int a = 5 - '0'; 
     System.out.println(a); //-43 
     Integer b = 5 - '0'; 
     System.out.println(b); //-43 
     System.out.println(Integer.valueOf(a)); //-43 
     System.out.println(String.valueOf(b)); //-43 
    } 

所以我对这段代码有两个问题。为什么int a = 5 - '0';在Java中可能吗?

  • 为什么int=5-'0';是可能的? 5是一个int,这是确定的,但旁边是一个字符,而不是为什么它不会引发任何错误?
  • 它是结果的ASCII值吗?比如何计算结果?

我知道的43 ASCII值+但它会转换'0'到它的ASCII,然后做了手术?

+0

因为字符是数字。 – tkausl

+1

只需查看一个ASCII表http://www.asciitable.com/'0'的ASCII值是48 –

+1

这是因为字符常量“0”在这种情况下被自动提升为int – fge

回答

7

Doc
char:char数据类型是一个单一的16位Unicode字符。它的最小值为'\ u0000'(或0),最大值为'\ uffff'(或65,535)。

在这种情况下,它是铸造 int,这就是它的原因。
更正 这叫做Widening Primitive Conversion。谢谢@Andreas!

+1好奇心

public static void main(String[] args) { 
     int a = 5 - '0'; 
    } 

我这个编译成字节码:

public static main([Ljava/lang/String;)V 
    L0 
    LINENUMBER 24 L0 
    BIPUSH -43 
    ISTORE 1 
    L1 
    LINENUMBER 25 L1 
    RETURN 
    L2 
    LOCALVARIABLE args [Ljava/lang/String; L0 L2 0 
    LOCALVARIABLE a I L1 L2 1 
    MAXSTACK = 1 
    MAXLOCALS = 2 
} 

公告计算与BIPUSH -43这意味着该值行构建时不运行时!

+0

“Doc”!=“specification”。doc可以声明任何内容,而不会造成任何后果。 –

+0

@MarkoTopolnik那么,Oracle坚果和螺栓教程肯定不是“声称任何事情”。 – GhostCat

+0

@GhostCat无关紧要。他们可以提出任何要求,并且我发现了一些不准确的地方。它们不是规范性的,这就是它的全部。 –

1

char数据类型是一个单一的16位Unicode字符。它的最小值为'\ u0000'(或0),最大值为'\ uffff'(或65,535)。

以上报价来自documentation。它清楚地表明,char的最小值是0,最大值是65,535。 Java提供从charint的投射。

按照specification:整型的

的值是在下列范围内的整数:(...)
对于char,从 '\ u0000的' 到 '\ uffff' 包容性,即是从0到65535

+0

你的“文档”只是一个内容丰富的教程。您应该引用[_specification_](https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.2.1)以供权威参考:“整型类型是字节,short,int和long,它们的值分别是8位,16位,32位和64位有符号二进制补码整数,以及char,其值是表示UTF-16代码的16位无符号整数单位(§3.1)。)' –

+0

@MarkoTopolnik我已将它添加到我的答案中。感谢您指出。 – xenteros

1

通过对int和char执行-操作,将使用char的ascii值(在您的情况下为48)。因此,表达式被转换成:

int a = 5 - 48; 
2

specification - data types描述,char表示UTF-16代码单元,其范围可以从\u0000\uffff

specification - integral types中所述,char是一个整数类型,这意味着它可以转换为任何其他整数类型。所以,\u0000可以认为是0\uffff可以认为是65535,都在int范围内。

在操作,操作数被转换为参与,所以在最大数据类型,

int a = 5 - '0'; 

5是int其表示比char更大的域。所以,'0'将被转换为48,并且操作变得:

int a = 5 - 48; //i.e. -43