博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java整型计算
阅读量:6691 次
发布时间:2019-06-25

本文共 2188 字,大约阅读时间需要 7 分钟。

整型计算

今天做LeetCode看到一道题,,其中一行代码if ((newResult - tail) / 10 != result)表示超出范围就会有损失,有点不太明白,正好之前复习过原码,反码,补码这些,研究了半天,写个总结。接下来从两个问题入门看计算机内部是如何计算的。

1. 为什么Integer.MAX_VALUE + 1 = Integer.MIN_VALUE

我们可以用java代码测试一下:

System.out.println(Integer.MAX_VALUE + 1);System.out.println(Integer.MIN_VALUE);打印:-2147483648-2147483648也就是-2^31

我们知道带符号整型的取值范围是[-2^31 ~ 2^31-1],在计算机中是以补码的形式存储的,先来复习一下什么是补码,反码和原码:

正整数的原码,反码和补码一样,符号位固定为0。负整数的符号位为1:反码 = 原码各位取反(除第一位符号位)补码 = 反码 + 1以-1为例:原码:10000000,00000000,00000000,00000001反码:11111111,11111111,11111111,11111110补码:11111111,11111111,11111111,11111111计算机内部是使用补码存储并且计算的,那么-1-1的过程就是-1的补码 11111111,11111111,11111111,11111111 - 1得到-2的补码:11111111,11111111,11111111,11111110那么-2的反码:11111111,11111111,11111111,11111101那么-2的原码:10000000,00000000,00000000,00000010

有了这个基础我们来看一下为什么Integer.MAX_VALUE + 1 = Integer.MIN_VALUE:

Integer.MAX_VALUE的二进制是:01111111,11111111,11111111,11111111+1得到10000000,00000000,00000000,00000000这是补码,根据补码可以得到反码:11111111,11111111,11111111,11111111注意:可能发现10000000,00000000,00000000,00000000 - 1应该是01111111,11111111,11111111,11111111啊,因为负整数符号位不变,因此符号位由0变为1.进而得到原码:10000000,00000000,00000000,00000000因为00000000,00000000,00000000,00000000已经表示为0了,计算机规定10000000,00000000,00000000,00000000就代表负整数的最小值即Integer.MIN_VALUE。因此Integer.MIN_VALUE的补码:10000000,00000000,00000000,00000000反码:11111111,11111111,11111111,11111111原码:10000000,00000000,00000000,00000000接着看一下Integer.MIN_VALUE + 1补码:10000000,00000000,00000000,00000001反码:10000000,00000000,00000000,00000000原码:11111111,11111111,11111111,11111111

2. 为什么Integer.MAX_VALUE * 10 = -10

Integer.MAX_VALUE * 10在计算机内部就是10个Integer.MAX_VALUE相加(好像是...)Integer.MAX_VALUE的二进制为:01111111,11111111,11111111,11111111首先看一下Integer.MAX_VALUE * 2就是01111111,11111111,11111111,11111111 +01111111,11111111,11111111,11111111 =11111111,11111111,11111111,11111110(补码)11111111,11111111,11111111,11111101(反码)10000000,00000000,00000000,00000010(原码)所以Integer.MAX_VALUE * 2 = -2可以使用System.out.println(Integer.MAX_VALUE * 2); 验证一下!接下来可以一步一步计算出Integer.MAX_VALUE * 10,就是10个Integer.MAX_VALUE相加最后结果为:11111111,11111111,11111111,11110110(补码)11111111,11111111,11111111,11110101(反码)10000000,00000000,00000000,00001010(原码)即-10.

补充:

为什么计算机内部要用补码进行计算,可以看看这篇文章:

转载地址:http://tbeao.baihongyu.com/

你可能感兴趣的文章
JavaScript 电话手机号码正则表达式
查看>>
Android之TelephonyManager&GsmCellLocation类的方法详解
查看>>
[置顶] 小技巧总结
查看>>
HDU 1251 统计难题(字典树)
查看>>
Web设计开发人员必备:15个Chrome插件
查看>>
Oracle_merge into 中 using 后的查询表如果有参数的情况
查看>>
【android】真机调试
查看>>
BAT教程 :第六节(if命令讲解)
查看>>
拓扑排序(邻接矩阵)
查看>>
试题总结(一)
查看>>
HDU 4288
查看>>
oracle:wm_concat函数与oracle版本
查看>>
Servlet学习总结
查看>>
[转载]WPF中触发器Trigger、MultiTrigger、DataTrigger、MultiDataTrigger、EventTrigger几种
查看>>
【SQL语法】系列08:利用Update更新表中数据
查看>>
修身--《孟子》尽心篇
查看>>
如何使用pyflakes给python做语法检查
查看>>
用man来查找c函数库 - 追寻前人的脚步 - 博客园
查看>>
让IIS 6 支持 JSP (IIS整合Tomcat)
查看>>
C# 的快捷键汇总(一)
查看>>