栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么这个乘法整数溢出会导致零?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么这个乘法整数溢出会导致零?

仅当的起始值
x
为偶数时,才会发生这种情况。

根据JLS§15.17.1:

如果整数乘法溢出,则结果是数学乘积 的低阶位
,以某种足够大的二进制补码格式表示。结果,如果发生溢出,则结果的符号可能与两个操作数值的数学积的符号不同。

如果我们以二进制格式而不是十进制格式打印数字,这将变得更加明显:

public class IntegerOverflow {  public static void main(String[] args) {    int x = 10;    int i = 0;    for (i = 0; i <= 5; i++)    {      x *= x;      System.out.println(Integer.toBinaryString(x));    }  }}

输出:

110010010011100010000101111101011110000100000000110111111000001000000000000000000

如您所见,每次平方时,零位数都会加倍。由于仅保存低位,因此每次加倍零将最终导致零。请注意,如果的起始值为奇数,则
看不到这些尾随零

x
。相反,它将导致看似不相关的数字,如溢出通常那样。

public class IntegerOverflow {  public static void main(String[] args) {    int x = 11;    int i = 0;    for (i = 0; i <= 5; i++)    {      x *= x;      System.out.format("%-12dt%s%n", x, Integer.toBinaryString(x));    }  }}

输出:

121  11110011464111100100110001214358881       1100110001101101101101100001772479681       101110000010110001101011000001-1419655807     10101011011000011100010110000001-1709061375     10011010001000011100101100000001


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/497120.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号