【问题标题】:Why does a character subtracted from anoter character in Java return an integer [duplicate]为什么在Java中从另一个字符中减去一个字符会返回一个整数[重复]
【发布时间】:2016-01-19 21:39:50
【问题描述】:

”0123”.charAt(0) - '0' 返回一个整数。这个整数是什么(为什么是这个整数),一般为什么char-char = int?

【问题讨论】:

  • '0' - '1' 是什么字符?
  • 它使用字符的 ascii 值。
  • @wero: -SOH(标题的负开始)当然:)

标签: java int character


【解决方案1】:

为什么是这个整数

因为编译器不能保证操作的结果会产生一个有效的字符值。由于字符、字节和整数都是隐式可互换的……而且由于整数是这三个中唯一一个包含所有三个可能值的超集……默认转换为整数。

@wero 在对上述问题的评论中说明了这一点:

'0' - '1' 是什么字符?

也就是说,如果你从一个较低的字符中减去一个较高的字符,那么你就会有一个否定的字符。这是无效的。但是,负整数是有效的。

或者考虑一个字节...如果将字节 250 添加到 250 会怎样?两者都是有效字节,但结果值不是有效字节。 (因为它是两个字节宽。)所以需要一个整数来包含它。

对于编译器可以保证生成值的常量表达式,可能存在(现在或将来)足够聪明的编译器来维护它。 (他们甚至可能会将其优化为编译时常量,而不是代码中的表达式。)例如:

`1` - `0`

但是,即使这样的编译器在使用 .charAt() 之类的东西时默认返回为整数,我也不会感到惊讶,因为它不再是一个常量表达式。作为人类,我们可以直观地推断出该表达式的恒定结果。但是编译器需要严格而简单的规则,引入方法调用会使这些规则相当复杂。

【讨论】:

    【解决方案2】:

    因为字符是用整数编码的。见ASCII table

    例如:

    int code = 99;
    char c = 'c';
    int cc = (int) c; //int cc = 99
    char sixty_seven = Integer.toString(code).charAt(0); //the char c
    

    ”0123”.charAt(0) – '0' is: 从字符串"0123" 中使用charAt(index) 方法从字符串中取出第一个字符,即0。然后我们查看ASCII表,看到0是48。那么减法后得到48-48 = 0。

    这是可能的,因为 JAVA 非常基于 C,其中没有字符串(字符串是一个 对象)。 “字符串”可以读取为 char 数组。 C 中的 int 和 chars 在各自的范围内是可以互换的(chars 是整数类型)。

    【讨论】:

      【解决方案3】:

      Java char 拥有一个 Unicode/UTF-16 代码单元。许多 Unicode 代码点在其 UTF-16 编码中只需要一个代码单元,并且这些代码单元的范围很广。因此,在这些范围内char 值可以被视为代码点。

      char 值之间的减法给出了它们之间的“距离”,这在处理少数“组织良好”的代码点序列时非常有用,例如基本拉丁字母(A-Z 或 a-z)。知道四分音符和二分音符或笑脸和眨眼之间的“距离”通常没有用处,......

      结果是一个整数,因为连续整数列表上的距离是用整数来衡量的。

      同样,这种技术仅在非常严格的情况下才有效。总是有一种较少限制的方法来做到这一点。

      请参阅Unicode Code Charts

      另请参阅java.lang.Character 类的文档。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多