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

长溢出,即使未超过限制

金健
2023-03-14

我有一段代码,我将byte、short和int设置为它们的最大值,然后将它们的总和乘以10,再加上50000。我在计算器上计算出这应该是允许的,因为结果小于long的最大值,但它给了我一个奇怪的输出。


public class Main {
    public static void main(String[] args) {
        byte byteValue = 127;
        short shortValue = 32767;
        int intValue = 2147483647;

        long longTotal = (50000L + 10L * (byteValue + shortValue + intValue));
        System.out.println(longTotal);
    }
}

输出:-21474457550预期输出:2.14 * 10^10

共有1个答案

何烨华
2023-03-14

您首先添加(byte)127(短)32767(int)2147483647。结果被Java隐式解释为int。所以这自然不合适。然后你做Long乘法和加法,但是到那时结果已经溢出了int边界,所以已经变成了负值。

你可以这样做:

long longTotal = 0;
longTotal += byteValue;
longTotal += shortValue;
longTotal += intValue;
longTotal *= 10;
longTotal += 50000;

@maloomeister提出了这种更简洁的方法:

long longTotal = (50000 + 10 * ((long) byteValue + shortValue + intValue));

所以在这里,加法的一个参数(不管是哪个)显式转换为long。这会触发Java将结果解释为long而不是int。

 类似资料:
  • 问题内容: 当用户上传文件时,我在php的error_log中收到类似的错误 PHP警告:11933650字节的POST内容长度超出了第0行中Unknown中的8388608字节的限制 在我的php.ini(在public_html中创建自定义ini文件)中是否可以解决此问题,我必须将其设置为1GB左右多少?我将在php.ini中将其设置更改为此,它将解决问题吗? 我将“ memory_limit

  • 但这并不能解决我的问题。我在我的分级中启用了multidex,因为没有它我会得到错误: com.android.dex.DexIndexOverflowException:方法ID不在[0,0xFFFF]:65536 所以这是一个解决方案,它在以前的Android Studio版本(也适用于公司的其他人,他们正在使用Android Studio1.4-2.0),但在我升级了我的Android St

  • 在此输入图像描述 这是我的代码,我试图解决它5个小时,但我没有得到什么问题,任何人都可以帮助。我也检查了资源,但代码与源代码相同,但它没有运行。

  • 我正在努力创造这个游戏https://en.wikipedia.org/wiki/Conway然而,每当我尝试使用printBoard方法时,我都会遇到以下错误 线程“main”java中出现异常。lang.ArrayIndexOutOfBoundsException:索引5超出长度5的界限。 我怎样才能解决这个问题?谢谢

  • 我收到一条PHP警告,上面说: PHP警告:POST内容长度2290848字节超过第0行未知中2097152字节的限制, 以下是我的配置: 在 /etc/php.ini 在/etc/httpd/conf/httpd中。形态 从上面看,我的帖子最大尺寸应该是2.5米。为什么在2M(2097152字节)的下限触发此警告?

  • 给定一个字符串,在不重复字符的情况下,找到最长子字符串的长度。例如,“abcabcbb”的不重复字母的最长子字符串是“abc”,其长度为3。对于“bbbbb”,最长的子字符串是“b”,长度为1。 对于长可重复字符串的最后一次测试,超过了时间限制。不知道如何优化。寻求改进,谢谢