【问题标题】:In java why we can't assign int to char directly??? but vice-versa is true?在java中为什么我们不能直接将int分配给char???但反之亦然?
【发布时间】:2013-12-28 08:04:15
【问题描述】:
public class CharAndIntTest {

    public static void main(String[] args) {
        char i='1';
        int ii=65;
        i=ii;
    }

}

【问题讨论】:

标签: java


【解决方案1】:

int 的容量大于char,因此不能保证转换有效。 char 值的可能范围是 0 到 65535,但 int 可以是 -2147483648 到 2147483647 之间的任何值。

但是,除了原始存储大小之外,还有其他考虑因素。 char 是无符号类型(实际上是 Java 唯一的内置无符号类型),因此即使 shortbyte 变量仍然需要转换为 char,因为它们可能是负数。 shortchar 都是 16 位的,但由于 short 已签名,其范围与 char 的范围不同(short 的范围从 -32,768 到 32,767)。

这里要学习的最重要的一点是,Java 只有在可以绝对确定转换会成功的情况下才允许进行隐式转换。 这适用于原语、对象、泛型等等一切。

您可以使用强制转换强制转换:

char i='1';
int ii=65;
i=(char)ii; //explicit cast tells the compiler to force the int into a char

【讨论】:

  • 那么 short 的大小与 char 的大小相同,但编译器也会给出错误
【解决方案2】:

chars 是 16 位无符号数,所以最多有 65,635
ints 是 32 位有符号数,所以最多有 2,147,483,647

因此,如果您将int 签名为char,对于所有值>= 65,635,肯定会出现问题。

【讨论】:

  • @kviiri 我的错,把标志弄混了,现在修好了。
【解决方案3】:

char 是 16 位数据类型,而 int 是 32 位数据类型。因此,一些可能的int 值不能用char 表示而不丢弃一些数据(截断)。编译器会创建一条错误消息来警告您意外截断可能导致的问题。

如果您进行了适当的转换,您仍然可以将 int 值分配给 char

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

您甚至可以像这样分配非法的char 值,尽管结果仍会被截断:

int i = 65555;
char c = (char)i; //still compiles and doesn't cause an exception, but data is lost
i = c; //i's value is 19

【讨论】:

    【解决方案4】:

    赋值转换 (JLS, Section 5.2) 允许基元加宽转换,但不允许基元收缩转换:

    当表达式的值是 分配(第 15.26 节)给变量:表达式的类型必须是 转换为变量的类型。

    分配上下文允许使用以下之一:

    • 身份转换 (§5.1.1)

    • 加宽基元转换 (§5.1.2)

    • 扩大参考转换 (§5.1.5)

    • 一个装箱转换(第 5.1.7 节)可选地后跟一个加宽 参考转化

    • 一个拆箱转换 (§5.1.8) 可选地后跟一个加宽 原始转换。

    所以你必须强制转换以执行原始缩小转换,除非

    另外,如果表达式是一个常量表达式(§15.28) 输入 byte、short、char 或 int:

    • 如果类型为 变量是 byte、short 或 char,以及常量的值 表达式可以用变量的类型来表示。

    所以分配一个文字就可以了:

    char a = 65;
    

    【讨论】:

    • +1 这适用于即使“更宽”类型更小,例如一个 64 位的 long 可以分配给一个 32 位的浮点数。即范围与精度无关。
    • short size 和 char size 是一样的,虽然会报错
    猜你喜欢
    • 2020-03-01
    • 1970-01-01
    • 2021-06-10
    • 2021-08-03
    • 2015-09-13
    • 2011-05-16
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多