【问题标题】:Conversion between character and int in JavaJava中字符和int之间的转换
【发布时间】:2011-03-02 10:05:20
【问题描述】:

您不能从 int 转换为 char,所以这是非法的 int i = 88; char c = i;,

不过这是允许的char c = 88;

不是纯数字和int 文字吗?这是怎么允许的?

【问题讨论】:

    标签: java


    【解决方案1】:

    实际上,从int 转换为char 是合法的,它只需要显式转换,因为它可能会丢失数据:

    int i = 88; 
    char c = (char) i;
    

    但是,对于文字,编译器知道它是否适合 char 而不会丢失数据,并且只会在您使用太大而无法放入 char 的文字时抱怨:

    char c = 70000; // compiler error
    

    【讨论】:

    • 别以为全是丢数据,一个能装在char里的字节也不能赋值给char
    • @GeorgianBenetatos 那是因为byte (-128..127) 的范围不完全包含在char (0..65535) 的范围内,所以 是 i> 有损转换的风险。
    【解决方案2】:

    char 在 Java 中实际上是一个无符号的 16 位整数类型。

    与其他整数类型一样,您可以执行从整数常量到任何整数类型的赋值转换,只要它在适当的范围内。这就是为什么

    byte b = 10;
    

    也可以。

    来自 JLS,section 5.2

    此外,如果表达式是 类型的常量表达式(§15.28) 字节、短、字符或整数:

    • 缩小原语转换可能 如果变量的类型是 byte、short 或 char,以及 常量表达式是 可表示的类型 多变的。
    • 缩小原语 转换后是拳击 转换可以使用,如果类型 变量是:
      • 字节和值 常量表达式是 可以用类型字节表示。
      • 短 和常数的值 表达式可以在 键入简短。
      • 字符和值 常量表达式是 可以用 char 类型表示。

    【讨论】:

    • char 不属于整数组。我的理解是这样的,因为编译器可以检查字面量的值,所以可以顺利地进行这种转换,在其他类型中可能会导致数据丢失,这是正确的
    • @user265260:嗯,是的,char 确实属于整数组。见java.sun.com/docs/books/jls/third_edition/html/…——“整数类型有byte、short、int和long,其值分别为8位、16位、32位和64位有符号二进制补码整数,以及char,其值是 16 位无符号整数,表示 UTF-16 代码单元(第 3.1 节)。"
    • 可能是一个附带问题,但为什么 char c = 2.0; 不允许。
    • @user265260:因为这是double类型的常量表达式。
    【解决方案3】:

    这是因为整数或小于 int 的字面量为 byte ,short 和 char 是 int。以这种方式理解以下内容。

    代码:

      byte a = 10;//compile fine
      byte b= 11;//compile fine
      byte c = a+b;//compiler error[says that result of **a+b** is **int**]
    

    对于任何数学运算,如“除”、“乘”和其他算术运算,都会发生同样的情况。所以转换结果以获得所需数据类型的文字

    byte c = (byte)(a+b);
    

    因此,与值 int 需要进行原始类型转换以更改 char 中的值的原因相同。 希望这有点道理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 2014-01-29
      • 1970-01-01
      • 2018-09-10
      • 2014-11-23
      • 2014-01-25
      相关资源
      最近更新 更多