当前位置: 首页 > 面试题库 >

Java文字值分配行为

鞠隐水
2023-03-14
问题内容

在Kathy Sierra撰写的SCJP指南书中的作业一章中,我们了解到可以声明这样的内容byte b = 7;。幕后的代码是byte b = (byte) 7;。之所以如此,是因为在Java中,数字7被认为是文字int值,因此必须转换为int。

现在其他情况。Double可以包含浮点值中包含的每个字节,因为它是更大的数据类型。所以我们可以说float f = 10.543;10.543是一个很小的值,应该适合浮点数。该数字的文字值也被视为Double,因此编译器应隐式将其强制转换为float。但是事实并非如此,编译器阻止了我们。我们必须在该值后附加Ff

为什么在字面值分配中存在这两个冲突的行为?简而言之,如果byte b = 7可能的话。为什么float f = 10.543不可能呢?


问题答案:

您可以阅读JLS
5.2分配转换

常量的编译时范围缩小意味着代码如下:

 byte theAnswer = 42;

被允许。如果不进行缩小,则整数文字42具有int类型的事实意味着将需要强制转换为字节:

byte theAnswer = (byte)42;  // cast is permitted but not required

如果表达式的类型不能通过赋值上下文中允许的转换转换为变量的类型,则会发生编译时错误。

如果变量的类型为float或double,则将值集转换(第5.1.13节)应用于值v

JLS#3.10.2。浮点文字

如果浮点文字后缀为ASCII字母F或f,则其类型为float。否则,其类型为double,并且可以选择在其后缀ASCII字母D或d

5.1.2。扩大原始转换

从double到float的原始转换变窄由IEEE
754舍入规则(第4.2.4节)控制。这种转换可能会失去精度,但也会失去范围,导致非零双精度浮点为零,而有限双精度浮点为无穷大。双精度NaN转换为浮点型NaN,双精度无穷大转换为相同符号的浮点无穷大。

我希望以上能澄清您的疑问。



 类似资料:
  • 问题内容: 我已经定义了一个Java数组,例如 我想在代码中进一步做这样的事情: 但这给了我一个编译错误。是否有一次更好的方法来一次定义多个值,而不是这样做? 谢谢! 问题答案: 是: 仅 在初始化程序中允许使用此语法。您不能在作业中使用它,以下是最佳做法: 要么 试图在语言规范中找到对此的参考,但是它像以往一样难以理解。其他人找到一个吗?

  • 本文向大家介绍VBA 分配长字符串文字,包括了VBA 分配长字符串文字的使用技巧和注意事项,需要的朋友参考一下 示例 VBA编辑器每行只允许1023个字符,但是通常只有前100-150个字符可见而不滚动。如果需要分配长字符串文字,但又想保持代码可读性,则需要使用行连续和串联来分配字符串。 VBA允许您使用有限数量的行连续(实际数量根据连续块中每行的长度而变化),因此,如果您的字符串很长,则需要使用

  • 问题内容: 我在Swift中使用可选字典发现了一些令人惊讶的行为。 我已经做了很多事情,试图找出我可能会缺少的东西,但是除了使字典不是可选的以外,似乎没有什么能使此代码正常工作。我想念什么? 我能得到的最接近的是以下内容,但它当然是荒谬的。 问题答案: 灯泡时刻是您意识到可选词典不是词典的时候。可选的东西不是那个东西!这是一个可选的!仅此而已。可选本身是一种类型。Optional只是一个枚举,包装

  • 问题内容: 一些外部数据供应商希望给我一个数据字段-管道分隔的字符串值,我觉得这很难处理。 没有应用程序编程语言的帮助,有没有办法将字符串值转换为行? 但是,存在一个困难,该字段具有未知数量的定界元素。 有问题的数据库引擎是MySQL。 例如: 问题答案: 它可能没有我最初想象的那么困难。 这是一种通用方法: 计算分隔符的出现次数 循环多次,每次获取一个新的定界值并将该值插入第二个表中。

  • 问题内容: 我的任务是编写一个程序,要求用户输入5个存储在列表中的名称。接下来,它随机选择这些名称之一,并宣布该人为获胜者。唯一的问题是,当我尝试运行它时,它说。 这是我的代码: 我必须能够生成一个随机名称。 问题答案: 操作员的左侧需要为变量。您在这里所做的就是告诉python:“您知道数字1吗?将其设置为输入的字符串。”。是文字数字,而不是变量。始终是,您无法将其“设置”为其他内容。 变量就像

  • 问题内容: 我对结构字段有疑问。 我已经创建了一个类与一种方法即增加或减少对象变量通过。另一种方法用于输出结果。 在一个新的实例与默认创建和,然后我打电话和。我希望在期间更改的值并产生,但它显示的是: 我的代码有什么问题? 问题答案: 您需要在此处使用指针,否则每次都仅更改原始对象的副本。一切都通过价值传递。