整型计算

今天做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整型计算相关推荐

  1. Java范值_Java范型

    定义类的时候,不为类的属性或方法的参数设置具体的类型,只使用一个标记表示,类使用的时候才动态地绑定一种数据类型,这就是范型. 如果应用使用了范型的类时没有指定类型,则会使用默认的类型Object. 1 ...

  2. java整形怎么转字符串型_java整型与字符串互转

    JAVA的整型与字符串相互转换 1字串 String 转换成整数 int 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt( ...

  3. java的整型_java 整型

    byte(1字节).short(2字节).int(4字节).long(16字节) java中前缀加上0b或者0b就可以写二进制数,前缀加上0就可以写八进制数,前缀加上0x或者0x就可以写十六进制数 一 ...

  4. java创建型_Java创建型模式

    Java创建型模式 在软件工程中,创建型模式是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象.基本的对象创建方式可能会导致设计上的问题,或增加设计的复杂度.创建型模式通过以某种方式控制 ...

  5. java 二进制最大值_java int型最大值/最小值,最大值+1,最小值-1

    java中,int型变量是有符号整形变量.int型变量占用4个字节(32bit位). int型变量采用补码形式来表示数值.对于一个二进制数,正数的补码是其本身,负数的补码是所有二进制位取反再加一. i ...

  6. java范形_java范型简介

    java范型简介 一.简单认识java范型 经常听人说"范型",我一直不是太明白什么叫"范型",今天就查阅了一些文章,给我的第一感觉就是之所以在java中用范型 ...

  7. java什么是布尔型_java布尔型介绍

    java布尔型介绍 Java 有一种表示逻辑值的简单类型,称为布尔型.它的值只能是真或假这两个值中的一个.它是所有的诸如a下面的程序说明了布尔类型的使用: // Demonstrate boolean ...

  8. java布尔变量_java布尔型变量理解

    .对布尔型变量赋值,只有true和false,缺省为false 实例: class BoolTest { public static void main(String args[]) { boolea ...

  9. java输入枚举型_Java 枚举型为什么是静态的,以及是怎么实现的?

    确实,枚举类型总让我们觉着怪怪的,无论是语法还是静态非静态,还是操作方法,总让人觉着它和数组.列表等格格不入.那到底是为什么呢? 我们从本质分析下java的枚举类型. 1 枚举类型初探 枚举类型,其语 ...

最新文章

  1. mysql数据库实验报告jdbc_Jdbc连接数据库实验报告(2)
  2. idea dump分析工具_实战:OOM 后我如何分析解决的
  3. 深度操作系统 15 Beta——每一处都在“靓”变
  4. 将spfile从ASM里迁移到文件系统
  5. 事物的级别_面试官问:MySQL锁与事物隔离级别你知道吗?
  6. Python2寿命只剩一个月啦!还不快赶紧学起Python3酷炫到爆的新特性!
  7. PyTorch基础-softmax函数mnist数据集识别-03
  8. 左神算法:最大值减去最小值小于或等于num的子数组的数量(Java版)
  9. cad 怎么显示块句柄_cad怎么显示工具栏
  10. 王道考研 计算机网络19 传输层 传输层的寻址与端口 TCP UDP
  11. 记录ionic 最小化应用时所遇的问题
  12. STM32——时钟系统
  13. pythontype函数使用_Python astype(np.float)函数使用方法解析
  14. 【华为云实战开发】8.如何快速搭建C#网站并实现持续集成?
  15. 彻底凉凉!两头部网红女主播账号被封,逃税被罚近亿元 还被曝不给员工交社保...
  16. Leecode刷题热题HOT100(6)——Z 字形变换
  17. 天玑800处理器支持鸿蒙系统吗,为何Redmi Note 9选择天玑800U处理器?和骁龙750G差距多大...
  18. 2014/08/11 – Backbonejs
  19. android数据绑定_Android数据绑定
  20. kodi pvr 不能安装_Kodi添加m3u8直播源教程 使用PVR IPTV Simple Client看电视直播

热门文章

  1. python3 删除 文件 文件夹
  2. golang 打印函数名/文件名/行号 Callers
  3. linux c printf 不能输出
  4. sqlmap tamper脚本编写
  5. Android 蓝牙开发实例--蓝牙聊天程序的设计和实现
  6. Shell脚本的调试技术
  7. 监控 Linux 性能的 18 个命令行工具
  8. 大学计算机系一周上几节课,大学生晒课程表,一周45节课无双休,三个专业是满课重灾区...
  9. 怎样学习linux系统管理员,linux系统管理员学习笔记
  10. 层次聚类多维度matlab实现_第34集 python机器学习:凝聚聚类