我想知道为什么在计算表达式或按位运算时将byte
和short
提升为值的原因int
?
因为Java语言规范是这样说的。第5.6.1节定义了用于撤消某些运算符的一元数值提升,并指出:
- 如果操作数的编译时类型为byte,short或char,则通过扩展基元转换(第5.1.2节)将其提升为int类型的值。
关于二进制数值运算符(“
binary”表示具有两个操作数,如“
+”的运算符)的评估的第5.6.2节说类似的话:
- 如果一个操作数的类型为double,则另一个将转换为double。
- 否则,如果其中一个操作数的类型为float,则另一个将转换为float。
- 否则,如果其中一个操作数的类型为long,则另一个将转换为long。
- 否则,两个操作数都将转换为int类型。
为什么这样定义?一个主要原因是,在设计Java语言和Java虚拟机时,计算机的标准字长为32位,而使用较小类型的基本算术在性能上没有优势。通过使用32位作为int大小,然后在Java字节码中提供专用指令,Java虚拟机被设计为利用此优势。用于使用整数,长整数,浮点数和双精度数的算术运算,但不适用于任何较小的数字类型(字节,短数和字符)。消除较小的类型将使字节码更简单,并使完整的指令集以及将来的扩展空间仍将操作码放在单个字节中。同样,JVM的设计偏向于在32位系统上轻松实现,在类和堆栈中的数据布局中,其中64位类型(双精度和长整数)占用两个插槽,而所有其他类型(32-位或更少)占用一个插槽。
因此,较小的类型通常在Java设计中被视为二等公民,并在各个步骤将其转换为int,因为这简化了某些事情。较小的类型仍然很重要,因为它们打包在一起时(例如,以数组形式)占用较少的内存,但是在计算表达式时却无济于事。
我想知道为什么每当计算表达式或处理位操作时,和值都会被提升为?
PEP 572引入了为Python 3.8实现的赋值表达式(俗称Walrus操作符)。这似乎是一个非常重要的新特性,因为它将允许在理解和lambda函数中进行这种形式的赋值。 赋值表达式的语法、语义学和语法规范到底是什么? 为什么在PEP 379中关于“添加赋值表达式”的类似想法之前遭到拒绝的情况下,引入了这个新的(似乎相当激进的概念)?
问题内容: 如何在Java中将(2个字节)转换为字节数组,例如 应该是这样的。但不确定。 编辑: 您也可以使用: 发现以获取本机位顺序是大还是小。另外,从以下代码中提取代码: 字节(数组/偏移量)为布尔值 字节数组到char 字节数组短 字节数组到int 浮动的字节数组 字节数组长 字节数组加倍 反之亦然。 问题答案:
问题内容: 我有以下代码 我知道根据JLS,只允许将常量表达式作为批注属性的值。但为什么?如果数据类型匹配,为什么还不够?如果要在运行时对表达式进行求值,是否有可能出错?每个规范背后都有逻辑推理吗? 问题答案: 注释就像类型扩展或有关该类型的元数据。 因为Java是一种静态类型的语言(意味着类型在编译时是已知的),所以在编译时也知道注释属性数据(元数据)似乎是合理的- 您正在定义/声明有关注释(扩
给定以下代码,在Switch-case语句中,'a'(char类型)是否自动提升为int类型? } 我找不到Java SE7是否提到了这一点。。 提前感谢您的澄清。 你好,丹尼尔
问题内容: 举个例子: 如果没有显式的print语句,Python如何以及为什么这样做? 如果我在IPython单元中执行相同的操作,则实际上只有最后一个这样的值以这种方式打印在stdout上: 为什么会这样? 问题答案: 当Python处于“交互式”模式时,它将启用非交互式模式中没有的某些行为。例如,最初在PEP 217中 指定。 如果value不为None,则此函数将其打印到sys.stdou