为什么Java中int型数据取值范围是[-2^31,2^31-1]
1、为什么Java中int型数据取值范围是[-2^31,2^31-1],多么神奇的问题,网上找了很多,找不到点子上,自己瞎总结一下子。
1.1、int是Java中的8种基本类型之一,一个int值占4个字节byte,一个字节是8位bit(即8个二进制位),所以int型占32位。其中第一位是标志位,标志位为0表示正数,标志位为1表示负数,剩余的31位是用来表示数字部分的。
1.2、在计算机中,数值一律用补码来表示和存储,原因在于,使用补码,可以将符号位和数值域统一处理。同时,加法和减法也可以统一处理。
1)、正整数的补码是其二进制表示,与原码相同。正数的反码与其原码相同,正数的原码、反码、补码都是相同的。
例:+9的补码是00001001。注意:这个+9的补码是用8位2进制来表示的,补码表示方式很多,还有16位二进制补码表示形式,以及32位二进制补码表示形式,64位进制补码表示形式等。每一种补码表示形式都只能表示有限的数字。
2)、求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。即负数的反码是对正数逐位取反,符号位保持为1。负数的反码等于原码符号位不变,其余各位逐位取反,补码等于反码加1。
例:-5对应正数5(00000101),那么-5(10000101),→所有位取反(11111010)→加1(11111011),所以-5的补码是(11111011)。
3)、0的补码,数0的补码表示是唯一的。
例:[+0]补=[+0]反=[+0]原=00000000,[-0]补=11111111+1=00000000。
2、为什么Java中int型数据取值范围是[-2^31,2^31-1]。即-2147483648 ~ 2147483647。
2.1、因为int型数据类型是有符号位的,所以这里拆分为两部分,一部分是正数,一部分是负数进行观察。
1)、正数的范围是从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,依此类推即可。
2)、负数的范围是从-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了。
3)、在二进制中,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是补码,它没有原码和反码。
4)、-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
作者:别先生
博客园:https://www.cnblogs.com/biehongli/
如果您想及时得到个人撰写文章以及著作的消息推送,可以扫描上方二维码,关注个人公众号哦。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2017-02-27 JDBC事务,银行转账,货物进出库等等。
2017-02-27 购物车的实现(jsp的session+Java的Map的结合)