为什么Java中int型数据取值范围是[-231, 231-1]

  1. 为什么Java中int型数据取值范围是[-231,231-1],网上很多解释都存在问题。

    • int是Java中的8种基本类型之一,一个int值占4个字节byte,一个字节是8位bit(即8个二进制位),所以int型占32位。其中第一位是标志位,标志位为0表示正数,标志位为1表示负数,剩余的31位是用来表示数字部分的。
    • 在计算机中,数值一律用补码来表示和存储,原因在于,使用补码,可以将符号位和数值域统一处理。同时,加法和减法也可以统一处理。
    • 正整数的补码是其二进制表示,与原码相同。正数的反码与其原码相同,正数的原码、反码、补码都是相同的。
    • 例:+9的补码是00001001。注意:这个+9的补码是用8位2进制来表示的,补码表示方式很多,还有16位二进制补码表示形式,以及32位二进制补码表示形式,64位进制补码表示形式等。每一种补码表示形式都只能表示有限的数字。
    • 求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。即负数的反码是对正数逐位取反,符号位保持为1。负数的反码等于原码符号位不变,其余各位逐位取反,补码等于反码加1。
    • 例:-5对应正数5(00000101),那么-5(10000101),→所有位取反(11111010)→加1(11111011),所以-5的补码是(11111011)。
    • 例如:0的补码,数0的补码表示是唯一的。
    • 例:[+0]补=[+0]反=[+0]原=00000000,[-0]补=11111111+1=00000000。
  2. 为什么Java中int型数据取值范围是[-231,231-1]。即-2147483648 ~ 2147483647。
    1) 因为int型数据类型是有符号位的,所以这里拆分为两部分,一部分是正数,一部分是负数进行观察。

    2)正数的范围是从1 ~ 2147483647的。
    例:1的原码为0000 0000 0000 0000 0000 0000 0000 0001。2147483647的原码为0111 1111 1111 1111 1111 1111 1111 1111。所以最大的正整数是2147483647。这里简单计算一下,为什么原码为0111 1111 1111 1111 1111 1111 1111 1111的最大的正整数是2147483647。当为1位时0000 0000 0000 0000 0000 0000 0000 0001,最大值的二进制就是1,也就是十进制的1 = 1,也就是2^1 - 1,当为2位时0000 0000 0000 0000 0000 0000 0000 0011,最大值的二进制是11,也就是十进制的1 + 2 = 3,也就是2^2 - 1,同理,8位时0000 0000 0000 0000 0000 0000 1111 1111,最大值的二进制是8个1,也就是1111 1111,算下来的十进制数值就是1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255,也就是2^8 - 1,依此类推即可。

    3)负数的范围是从-1 ~ 2147483648的。
    例:-1的原码为1000 0000 0000 0000 0000 0000 0000 0001,反码为1111 1111 1111 1111 1111 1111 1111 1110,补码为1111 1111 1111 1111 1111 1111 1111 1111。-2147483647的原码为1111 1111 1111 1111 1111 1111 1111 1111,反码为1000 0000 0000 0000 0000 0000 0000 0000,补码为1000 0000 0000 0000 0000 0000 0000 0001。

    那么为什么负数的范围是从-1 ~ 2147483648的。因为要看0了。

    4)在二进制中,0有两种表方法。+0的原码为0000 0000 0000 0000 0000 0000 0000 0000,-0的原码为1000 0000 0000 0000 0000 0000 0000 0000,因为0只需要一个,所以把-0拿来当做一个最小的数-2147483648。-2147483648的补码表示为1000 0000 0000 0000 0000 0000 0000 0000,在32位没有原码。由于1000 0000 0000 0000 0000 0000 0000 0000本身代表的是2147483648(即2的32-1次方),再加上最高位为1,那么就是个负数,再加上所有的二进制表示又少了一个,因此,1000 0000 0000 0000 0000 0000 0000 0000就顺理成章的成了-2147483648,当然,1000 0000 0000 0000 0000 0000 0000 0000是补码,它没有原码和反码。

    5)-2147483648的补码表示为1000 0000 0000 0000 0000 0000 0000 0000,在32位没有原码。注意,这个补码并不是真正的补码,-2147483648真正的补码是1 1000 0000 0000 0000 0000 0000 0000 0000,在Java的int基本数据类型中溢出了。所以带符号32位int类型整数为-2147483648~2147483647

参考链接:Java中int取值范围的原因

Java中int的取值范围的原因相关推荐

  1. Java|Java中int的取值范围是多少

    Java 中 int 的取值范围是:-2^31 ~ 2^31-1 大致想一下,int 占 4字节,也就是 32 位,int 是有符号的,最高位为符号位.所以剩下31个位置. 那么我们大胆猜测一下,最大 ...

  2. Java中int的取值范围

    先上代码,通过下面代码的执行结果观察 public class Test {public static void main(String[] args) {// 2的31次方int j = (int) ...

  3. java中int的取值范围是多少

    最近在看算法书的时候发现一个非常有意思的现象,在java中输入: System.out.println(Math.abs(-2147483648)); 输出为:-2147483648 针对这个问题,我 ...

  4. java int值的范围_java中int的取值范围是多少

    java中int的取值范围是多少 发布时间:2020-06-26 14:53:13 来源:亿速云 阅读:159 作者:Leah 今天就跟大家聊聊有关java中int的取值范围,可能很多人都不太了解,为 ...

  5. python中int数据范围_Python中int的取值范围是多少

    Python中int的取值范围是多少 发布时间:2020-10-30 09:33:50 来源:亿速云 阅读:66 作者:小新 这篇文章将为大家详细讲解有关Python中int的取值范围是多少,小编觉得 ...

  6. C/C++中int的取值范围

    直接答案: 我们常常看到int取值范围为-32768-32767,实际上int的取值范围依赖于计算机系统,在16位机器中,int占16位,其中一位为符号位,所以取值范围为前面所说的-32768-327 ...

  7. Java中数据类型的取值范围

    整数数据类型的取值范围 我们都知道计算机的底层是二进制,也知道不同的整数类型存储值的范围不同,可这些数值在计算机底层是怎样存储的呢?数值范围又是怎么计算出来的呢? 下面以java来进行举例: byte ...

  8. java中random方法取值范围_Java中的Random()函数

    今天在做Java练习的时候注意到了Java里面的一个随机函数--Random,刚开始只是知道这个函数具有随机取值的作用,于是上网搜索了资料一番,做了一下一些关于Random函数的总结: Java中存在 ...

  9. java中integer取值范围,Java中的Integer取值范围(-2^32 ~ 2^31 - 1)分析

    在Java中Integer的最小值(MIN_VALUE).最大值(MAX_VALUE)定义如下: /** * A constant holding the minimum value an {@cod ...

最新文章

  1. hiho_1139_二分+bfs搜索
  2. 基于OpenCV的行人目标检测
  3. 古朴西安:乘汽船去机场
  4. freemark简单事例
  5. leetcode : Reverse Linked List II [two pointers]
  6. AOP的MethodBeforeAdvice
  7. Dreamweaver中如何格式化代码
  8. 讲解Java中的String几种类型
  9. RSS、Atom和Feed概念与实现(django)
  10. WCF透明代理类,动态调用,支持async/await
  11. T-SQL行合并成列与列拆分成行
  12. 大数据hadoop学习【9】-----通过JAVA语言编程,实现对Hbase数据库表及数据的相关操作
  13. 电梯轿厢内电动车自行车人数据集,VOC标签格式已标注
  14. utc时间 单位换算_DataTime.Now.Ticks精确的时间单位[转]
  15. 软件测试与质量保障之间的关系
  16. 今日分享—————论成长性思维对人的重要性
  17. python魔方方法__add__、__mul__、__sub__、__truediv__
  18. 英国python工资_就业强势起薪高?英国BA硕士哪家强?!
  19. MS10_002漏洞利用
  20. DCF(Discounted Cashflow)模型(学习笔记三)

热门文章

  1. 过程计算机系统 pcs,炼钢AOD炉过程计算机系统设计与实现-软件工程专业毕业论文.docx...
  2. 多智能体系统——竞争网络下异构多智能体系统的分组一致性问题 Group consensus of heterogeneous multi-agent system (附论文链接+源码Matlab)
  3. Java下载Excel文件
  4. 【机器学习】深度学习20个笔试题
  5. 中文写程序,何陋之有?
  6. HTB打靶(Active Directory 101 Reel)
  7. SASE:基于数字身份标识的网络与安全访问云服务
  8. 深度解析Linux通过日志反查***
  9. UML 之 C++类图关系全面剖析
  10. ShopXO开源电商系统源码支持PC+H5支付宝小程序微信小程序百度小程序头条amp;抖音小程序QQ小程序APP等