java 整型_Java整型计算
整型计算
今天做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.
补充:
为什么计算机内部要用补码进行计算,可以看看这篇文章:
java 整型_Java整型计算相关推荐
- Java范值_Java范型
定义类的时候,不为类的属性或方法的参数设置具体的类型,只使用一个标记表示,类使用的时候才动态地绑定一种数据类型,这就是范型. 如果应用使用了范型的类时没有指定类型,则会使用默认的类型Object. 1 ...
- java整形怎么转字符串型_java整型与字符串互转
JAVA的整型与字符串相互转换 1字串 String 转换成整数 int 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt( ...
- java的整型_java 整型
byte(1字节).short(2字节).int(4字节).long(16字节) java中前缀加上0b或者0b就可以写二进制数,前缀加上0就可以写八进制数,前缀加上0x或者0x就可以写十六进制数 一 ...
- java创建型_Java创建型模式
Java创建型模式 在软件工程中,创建型模式是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象.基本的对象创建方式可能会导致设计上的问题,或增加设计的复杂度.创建型模式通过以某种方式控制 ...
- java 二进制最大值_java int型最大值/最小值,最大值+1,最小值-1
java中,int型变量是有符号整形变量.int型变量占用4个字节(32bit位). int型变量采用补码形式来表示数值.对于一个二进制数,正数的补码是其本身,负数的补码是所有二进制位取反再加一. i ...
- java范形_java范型简介
java范型简介 一.简单认识java范型 经常听人说"范型",我一直不是太明白什么叫"范型",今天就查阅了一些文章,给我的第一感觉就是之所以在java中用范型 ...
- java什么是布尔型_java布尔型介绍
java布尔型介绍 Java 有一种表示逻辑值的简单类型,称为布尔型.它的值只能是真或假这两个值中的一个.它是所有的诸如a下面的程序说明了布尔类型的使用: // Demonstrate boolean ...
- java布尔变量_java布尔型变量理解
.对布尔型变量赋值,只有true和false,缺省为false 实例: class BoolTest { public static void main(String args[]) { boolea ...
- java输入枚举型_Java 枚举型为什么是静态的,以及是怎么实现的?
确实,枚举类型总让我们觉着怪怪的,无论是语法还是静态非静态,还是操作方法,总让人觉着它和数组.列表等格格不入.那到底是为什么呢? 我们从本质分析下java的枚举类型. 1 枚举类型初探 枚举类型,其语 ...
最新文章
- mysql数据库实验报告jdbc_Jdbc连接数据库实验报告(2)
- idea dump分析工具_实战:OOM 后我如何分析解决的
- 深度操作系统 15 Beta——每一处都在“靓”变
- 将spfile从ASM里迁移到文件系统
- 事物的级别_面试官问:MySQL锁与事物隔离级别你知道吗?
- Python2寿命只剩一个月啦!还不快赶紧学起Python3酷炫到爆的新特性!
- PyTorch基础-softmax函数mnist数据集识别-03
- 左神算法:最大值减去最小值小于或等于num的子数组的数量(Java版)
- cad 怎么显示块句柄_cad怎么显示工具栏
- 王道考研 计算机网络19 传输层 传输层的寻址与端口 TCP UDP
- 记录ionic 最小化应用时所遇的问题
- STM32——时钟系统
- pythontype函数使用_Python astype(np.float)函数使用方法解析
- 【华为云实战开发】8.如何快速搭建C#网站并实现持续集成?
- 彻底凉凉!两头部网红女主播账号被封,逃税被罚近亿元 还被曝不给员工交社保...
- Leecode刷题热题HOT100(6)——Z 字形变换
- 天玑800处理器支持鸿蒙系统吗,为何Redmi Note 9选择天玑800U处理器?和骁龙750G差距多大...
- 2014/08/11 – Backbonejs
- android数据绑定_Android数据绑定
- kodi pvr 不能安装_Kodi添加m3u8直播源教程 使用PVR IPTV Simple Client看电视直播
热门文章
- python3 删除 文件 文件夹
- golang 打印函数名/文件名/行号 Callers
- linux c printf 不能输出
- sqlmap tamper脚本编写
- Android 蓝牙开发实例--蓝牙聊天程序的设计和实现
- Shell脚本的调试技术
- 监控 Linux 性能的 18 个命令行工具
- 大学计算机系一周上几节课,大学生晒课程表,一周45节课无双休,三个专业是满课重灾区...
- 怎样学习linux系统管理员,linux系统管理员学习笔记
- 层次聚类多维度matlab实现_第34集 python机器学习:凝聚聚类