首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么在使用它编译的赋值进行内联类型转换时?

为什么在使用它编译的赋值进行内联类型转换时?
EN

Stack Overflow用户
提问于 2019-11-17 22:21:45
回答 4查看 76关注 0票数 1

这是我的Example代码

代码语言:javascript
代码运行次数:0
运行
复制
class Example{
    public static void main(String args[]){


        short s = 100;
        byte b = s;         // this is compile time error because of no casting

        byte z = (short)25.12; // why this happens 

        System.out.println(z);
        System.out.println(((Object)z).getClass());

    }
}

请原谅我,因为我刚刚开始学习java。你能在技术上告诉我这个问题吗?

EN

回答 4

Stack Overflow用户

发布于 2019-11-18 00:09:26

  1. 你的这行byte b = s;会给出错误,因为你不能将较大的数据类型(2字节)赋给较小的数据类型(1字节)。这就是为什么它会给你编译时错误的原因,

  1. byte z = (short)25.12;,现在到这一行,让我们来分析一下。默认情况下,25.2,但是当您使用(short)对其进行类型转换时,它变成了25,这是一个整数文字。现在编译器将检查25是否可以存储在字节中。由于5-128和127之间,也就是字节的范围,所以它不会产生任何编译时错误。但是如果你给出的值超出了字节的范围,它就会给出错误。例如:byte z = (short)128.12;
票数 2
EN

Stack Overflow用户

发布于 2019-11-18 00:23:02

编译器不会运行源代码,也不会分析其逻辑。编译器只是从源代码的每一行创建字节码。

当编译器看到byte b = s;时,它只会尝试生成赋值为b的代码。它不会回顾您的代码来查看哪些其他指令可能影响了s的值。

它只知道在该行代码中,您正在尝试将一个8位值(一个字节)设置为一个未知的16位值(短值)。当编译器查看这行代码时,它不考虑前面的任何行,因此它不关心先前的赋值;它将s视为一个未知的16位值。这个未知值可能是也可能不是适合8位的值。

另一方面,byte z = (short)25.12;是安全的,因为编译器不需要查看任何其他指令就可以知道25可以适合8位。将其转换为short并不重要。重要的是,隐式地将其转换为byte不会丢失任何信息。

对于(int) 25来说也是如此。在所有情况下,25将适合8位,而不会丢失信息。

票数 1
EN

Stack Overflow用户

发布于 2019-11-17 22:47:32

将较大的数据类型转换为较小的数据类型并不是隐式的,因为它可能导致不正确的转换(数据丢失)。

代码语言:javascript
代码运行次数:0
运行
复制
         byte b = s;

这就是为什么上面的代码行不能编译,因为s的类型是short (2字节),而b的类型是byte (1字节)。因此,您需要显式地对其进行类型转换

代码语言:javascript
代码运行次数:0
运行
复制
         byte b = (byte)s;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58901397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档