为什么int变量抛出一个错误,而不是在分配给一个字节变量文字的诠释?

coderboy:

我最近开始学习Java,而不能只是理解语言的一个特征。

当我写下面的代码我没有得到任何错误(和理智我不应该!):

byte b = 10 * 2

然而,当我在下面的代码输入,编译器会引发错误:

int i = 10;
byte b = i * 2

当编译器可以执行检查上10 * 2,以确保它是小于的范围byte,为什么不能也进行一个检查i * 2,看看它是否是不足的范围byte

它是否得到的东西做位的较低级别的代表,或者说相关的记忆?

tplusk:

我不是Java的任何具体的利好,但任何现代编译器会进行不断折叠,以“倍”这完全是常量表达式。即,10 * 2倍至20所以编译器把它当作如果您键入byte b = 20;

这是不是真的实用的编译器,试图优化变量。即使在您提供的例子是比较简单的看,知道i10,如果一个编译器将尝试以优化并了解i了,那就要维护它自己的符号表,将基本上是一个解释。由于Java是一个预编译的语言,这违背了目的。

阐述:

有一个编译器和解释器之间的差异。编译器需要在源代码作为输入,并写入在幕后机器代码。当这台机器的代码被执行,操作/执行/执行计算。Java是编译型语言,所以它的编译器是不是做大量的计算,它只是编写可以在Java虚拟机上运行的机器代码。Python的,另一方面,是一种解释型语言。当你运行一个Python程序,它不会尝试做任何类型转换为i * 2后才它实际工作中求值i * 2

现在,有时编译器试图耍小聪明,并且已经建立了“优化”。这意味着,而不是写机器代码,做一些操作,他们写更少的指令的机器代码,因为它知道它是什么(所以编译器做了一些计算,以实现这一目标)。在你的榜样,而不是存储10号写的机器指令,存储号码2,乘他们,然后将结果存储,编译器可以多10个和2个,并且只写一个机器指令来存储结果。

当我们引入变量,它变得更难编译器优化,并找出该变量是什么。实际的编译程序(Java编译器)将要记住,我是拿着10号,现在的变量。如果我们要优化只知道我们能分配I * 2的byte,这将意味着,编译器会一定要记得上关的机会,它被分配到一个字节在以后的表达每一个整数变量-在这一点上它是不是真的值得的优化,编译器花费额外的计算(额外的工作来编译)并没有真正给予任何好处。符号表(如上所述)基本上是记住变量和它们的值是什么表。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么有当最终诠释被分配到一个字节没有错误

在C#中,将两个字节变量添加到另一个字节变量的结果分配产生错误,只能分配给int变量

根据变量的最后一个字符将一个类分配给Div?

为什么更新一个变量也会更新分配给它的变量?

为什么InputStream#read()返回一个int而不是一个字节?

如何将字符串的最后一个字符分配给变量?

如何将int和字符串数组快速分配给一个字符串变量?

为什么“ ref”不将更新的值分配给下一个字段?

为什么read()输出一个字节而不是一个字符串?

为什么将包含在字符串变量中的Javascript分配给另一个字符串变量后立即执行?

为什么将一个分配给另一个的方法与在 C++ 中分配两个单独的变量不同?

在Python中将一个变量的值分配给另一个变量时会发生什么?

将静态变量分配给另一个静态变量。为什么会引发错误?

仅第一个字节将分配给字符串偏移警告

为什么将一个变量的值分配给另一个变量在python中保留在内存中?

在分配给一个临时变量循环值为什么不能打印,因为它是什么?

为什么在Rust中允许将向量的整数值分配给另一个变量?

为什么将列表切片分配给另一个变量会改变结果?

为什么将函数分配给另一个变量会起作用

在python中分配给第一个变量的值会发生什么?

将struct的第一个变量分配给另一个

Python将值从一个变量分配给另一个

我想检查一个变量是否被分配给一个整数

从列表中取出一个元素并将其分配给一个变量

如何将一个字符串附加到单词列表中的每个单词并将新单词列表分配给变量?

为什么使用 char 变量从文件中读取一个字符又吃了一个下一个字符?

为什么我可以将一个Int分配给一个没有编译器错误的字符串?

android将两个字符串变量之一分配给另一个类中的一个字符串

为什么一个字节(以位为单位)的大小是实现定义的并带有该变量?我认为一个字节总是一致的 8 位