整数的溢出

a_king_long 2017-02-23 06:02:50


求人解释下为什么结果是这个

还有为什么 x*x 是等于0 而Math.pow(x,2)却不是啊?头都大了
...全文
235 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ps45221 2017-03-01
  • 打赏
  • 举报
回复
仔细分析下就明白结果怎么来的了: 1、首先第一个结果,x是溢出了应该都是知道的,在Java中,int类型的变量是4字节的有符号数,也就是32位的(32个二进制), 有过计算机基础的都应该知道,有符号数首位二进制数是符号位,所以int类型最大的正整数为2^31-1(二进制为0111111...总共31个1) 当x为最大正整数时,此时在加1,值变为2^31(二进制为10000...总共31个0),前面说了第一位代表符号位,所以此时就是负数,10进制结果为-2147483648 2、第二个结果,在明白了第一个结果的情况下,x*x就是2^31*2^31=2^62,二进制结果为01000...后面总共62个0,因为java中int是4字节的,当遇到超过位数时,就截取低32位, 而2^62低32位全是0,所以x*x结果为0。 3、第三个结果是正确的,因为pow这个函数参数、返回值都是double的,所以没有溢出,只是用科学计数法表示的,用windows自带的计算器计算下可知道,2^62的10进制结果为4611686018427387904。
  • 打赏
  • 举报
回复
你这代码一看就是个死循环,等到x的值超过了int的范围才报错
  • 打赏
  • 举报
回复
引用 4 楼 jiajing1990_ 的回复:
引用 3 楼 LinBilin_ 的回复:
你这代码一看就是个死循环,等到x的值超过了int的范围才报错
可是lz并没有说报错诶
因为刚好返回一个负数,满足小于0的条件才退出while,然后打印信息
jiajing1990_ 2017-02-24
  • 打赏
  • 举报
回复
引用 3 楼 LinBilin_ 的回复:
你这代码一看就是个死循环,等到x的值超过了int的范围才报错
可是lz并没有说报错诶
Long丶胖 2017-02-23
  • 打赏
  • 举报
回复
Math.Pow 方法 (Double, Double)
「已注销」 2017-02-23
  • 打赏
  • 举报
回复
Open Declaration double java.lang.Math.pow(double a, double b) 我觉得可能的原因是pow里面是double??要不你试试x用double型的看看,好吧,其实我也不知道什么原因

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧