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

为什么int i = 1024 * 1024 * 1024 * 1024编译时没有错误?

谷玉韵
2023-03-14
问题内容

上限为int-2147483648至2147483647。

如果我输入

int i = 2147483648;

然后Eclipse将在“ 2147483648”下提示红色下划线。

但是,如果我这样做:

int i = 1024 * 1024 * 1024 * 1024;

它将编译良好。

public class Test {
    public static void main(String[] args) {

        int i = 2147483648;                   // error
        int j = 1024 * 1024 * 1024 * 1024;    // no error

    }
}

也许这是Java中的一个基本问题,但是我不知道为什么第二个变体不会产生任何错误。


问题答案:

那句话没有错。您只是将4个数字相乘并将其分配给一个int,恰好发生溢出。这与分配单个 文字 不同,后者在编译时会进行边界检查。

导致错误而不是 赋值的 是超出范围的 文字 : __

System.out.println(2147483648);        // error
System.out.println(2147483647 + 1);    // no error

相反,long文字可以编译良好:

System.out.println(2147483648L);       // no error

请注意,实际上,结果仍然 在编译时计算的,因为它1024 * 1024 * 1024 * 1024是一个
常量表达式


int i = 1024 * 1024 * 1024 * 1024;

变成:

   0: iconst_0      
   1: istore_1

请注意,结果(0)只是简单地加载和存储,并且不会发生乘法。

从JLS§3.10.1起(感谢@ChrisK在评论中提出):

如果type的十进制文字int大于2147483648(2
31),或者十进制文字2147483648出现在非一元减运算符的操作数之外的任何地方(第15.15.4节),则这是编译时错误。



 类似资料:
  • 的限制是从-2147483648到2147483647。 如果我输入 然后Eclipse会在“2147483648”下提示红色下划线。 但是如果我这样做: 很好。 也许这是Java中的一个基本问题,但我不知道为什么第二个变体不会产生错误。

  • 1024 1024是一个基于Java 的小游戏。 游戏规则 可将活动方块向上,下,左,右4个方向移动 相同数字的方块碰撞到一起可合并为一个方块,合并的方块数字为2者之和 操作 选中:单击目标方块 移动:上(W),下(S),左(A),右(D)  重新开始:空格(Space) 演示 数字与颜色对照表 对应的数字依次为2的N次方 版权 本软件遵循GPL(GNU GENERAL PUBLIC LICENS

  • 问题内容: 如何转换此C(数组)类型: 转到此Go(数组)类型: ?尝试进行接口转换会给我这个错误: 问题答案: 最简单,最安全的方法是将其复制到切片中,而不是专门复制到 要直接使用内存而不进行复制,可以通过来“广播” 。

  • 问题内容: 在Java中将字符串拆分为1024个字节的块的有效方法是什么?如果有多个块,则需要在所有后续块中重复标头(固定大小的字符串)。 问题答案: 字符串和字节是完全不同的两件事,因此要将字符串拆分为字节与将绘画拆分为经文一样没有意义。 您实际上想做什么? 要在字符串和字节之间进行转换,您需要指定一种编码,该编码可以对String中的所有字符进行编码。根据编码和字符,其中一些可能跨越一个以上的

  • 在iOS10中,NSlog限制为1024个字符,任何人都知道打印完整字符串的解决方法。

  • 我正在使用最新版本的骆驼和Netty与Spring,并且具有以下定义: 我定义了一个类来处理传入的tcp请求: 我的问题是,不管传入消息的大小,buf变量永远不会超过1024字节,因此我的请求被截断。 根据组件定义,receiveBufferSize应该是65536字节。我如何处理大的请求?