当前位置: 首页 > 知识库问答 >
问题:

Java原语范围计算[重复]

段干庆
2023-03-14

在Java中,当我们声明

short number=1024*1024*1024; 

它会给编译时间错误,但是

short number=1024 * 1024 * 1024 * 1024;

编译得很好。为什么会这样?

共有2个答案

朱俊雅
2023-03-14

当你的电话号码越来越多时,你正面临着这个问题。在第一种情况下,它不会环绕,因此会溢出短波范围。但在第二种情况下,它在计算A后会卷绕,因此它在短范围内,因此没有编译时错误。

精度损失意味着您正在丢失给定值的信息。(短数据类型是16位有符号二的补码整数。它的最小值为-32,768,最大值为32,767(含)。)在第一种情况下,短的范围被跨越(1073741824),因此你失去了信息。

有符号整数到整数类型T的缩小转换只会丢弃除n个最低阶位以外的所有位,其中n是用于表示类型T的位数。

编辑:-

来自JLS§3.10.1(在类似问题中提到得非常正确)

如果int类型的十进制文字大于2147483648(231),或者如果十进制文字2147483648出现在一元减号运算符的操作数之外的任何位置(§15.15.4),则这是编译时错误。

爱乐邦
2023-03-14

在这种情况下,编译器将评估计算(因为它只包含常量)并尝试将结果分配给变量。这种计算是通过类型int完成的,并且只有在分配时才转换为,如果可能的话。

在您的情况下,第一次计算太大,无法放入short1073741824)。第二个将溢出int,并在short支持的范围内结束(0)。因此,在这种情况下,作业是有效的。

请注意,您可能永远不想依赖代码中的这些东西。

 类似资料:
  • 我参加了一个编程比赛,我无法解决问题,问题是: 给定一个n个整数的数组A,我需要计算给定范围内求逆的次数。提供一个整数m,它表示范围的数量,然后是m行,在每一行中给出两个整数li和ri。 我们必须只计算指定范围内的反转,即从li到ri(包括0)的反转(基于0的索引)。 如果 A[i] 两个元素 A[i] 和 A[j] 添加到反演中 反转是: 输入: 输出: 约束: 我知道在整个数组上计算O(nlo

  • 问题内容: 我有两个日期范围,每个范围都由开始日期和结束日期确定(显然,datetime.date()实例)。这两个范围可以重叠也可以不重叠。我需要重叠的天数。当然,我可以用两个日期范围内的所有日期预填充两个集合,并执行一个集合交集,但这可能效率不高…除了长距离的if- elif部分覆盖所有情况的解决方案,还有其他更好的方法吗? 问题答案: 确定两个开始日期中的最晚一个,以及两个结束日期中最早的一

  • 我试图理解switch语句。所以我已经解决了这个问题。“软件公司销售的软件包零售价为99美元。数量折扣如下: 10-19=20% 20-49=30% 50-99=40% 100或更多=50% 编写一个程序,要求用户输入购买的软件包数量。然后,程序应显示折扣金额(如果有)和折扣后的购买总额。 我使用结构和几个关系运算符,它看起来像这样 我想知道是否可以将可能的数字范围存储在单个变量中,然后将其用于语

  • 问题内容: 我的数据库中有以下一组匹配日期的日期(dd / MM / yyyy): 事件具有开始和结束日期(时间无关紧要),并且endDate为NULL表示事件仍在进行中。 我想确定的是两个任意日期之间的日期范围,其中a)没有事件,b)事件重叠。 因此,对于输入日期范围01/04/2009-30/06/2009,我希望得到以下结果: 注意,作为结果,两个相邻的重叠范围是可以接受的。 谁能用SQL算

  • 问题内容: 我希望能够根据其他两个IP范围内的IP返回true / false。 例如: 结果应为true。 其他例子: 问题答案: 检查范围的最简单方法可能是将IP地址转换为32位整数,然后比较这些整数。 而不是,您可能想要查看具有InetAddresses帮助器类的Guava库,该类避免了DNS查找的可能性。

  • 本文向大家介绍C#范围和重复,包括了C#范围和重复的使用技巧和注意事项,需要的朋友参考一下 示例 的Range和Repeat静态方法Enumerable可用于生成简单序列。 范围 Enumerable.Range() 给出给定起始值和计数的整数序列。 .NET Fiddle上的实时演示 重复 Enumerable.Repeat() 在给定一个元素和所需重复次数的情况下,生成一系列重复元素。 .NE