2个字节能存多少个16进制_Java语言中最大的整数再加1等于多少?看完秒懂

短文涨姿势,看了不白看,不关注等啥?

已知Java语言中int类型所能表示的最大整数为2147483647,请问以下代码执行结果是什么?

1f2d9b7b4e1cd06a246e60594ddad144.png

一部分人都会认为这段程序压根就无法通过编译,也有人认为,这段程序能够通过编译,但在运行时会抛出异常,但更多的人面对这道题目根本就无从下手。那么正确答案是什么呢?首先告诉大家,这段程序能够顺利通过编译,并且在运行时也不会出现异常,运行的结果是在控制台上输出了数字-2147483648!而-2147483648正好是Java语言中int类型所能表示的最小整数。

这个运行结果可能会让很多人感到大跌眼镜,运行结果为什么会是这样的呢?想弄明白其中的原理,就必须先弄清楚Java语言中数字的表示和存储方式。

大家都知道:任何一个数字,存储到计算机当中,都是以二进制的形式进行存储的。在Java语言中,使用补码的形式来表示数字。那么补码是个什么东西呢?补码就是计算机用二进制的形式表示数字的一种规则。它的算法很简单:用最左边的一个二进制位表示数字的正负,0表示正数,1表示负数,我们把表示符号的这个二进制位叫做“符号位”,而剩余的二进制位表示数字本身。至于怎样用其余的二进制位表示数字,正数和负数略有区别。我们首先来说正数的情况。对于正数而言,直接用剩余二进制位表示这个数字就可以了。而对于负数而言,算法稍微复杂一点,分为两步:

第一、用补码表示出这个数的绝对值,之后把每个位上的数字(连同符号位上的数字在内)按位取反,所谓按位取反就是如果这个位上原来是0,那么就变成1,如果原来这个位上原来是1,那么就变成0。

第二、就是把这个取反以后的数字加上1,就得到了负数的补码表示结果。

没看懂?没关系!咱们用例子说事。首先必须知道,Java语言中int类型的数据占4个字节,那么4个字节所能表示的最大整数是多少呢?按照补码的表示规则,这个最大的整数存储到计算机当中应该是“1个0跟31个1”:

69758ae691578fc95bbc59ca8d850236.png

如果我们强行给这个数再加1,按照二进制的进位规则,它会变成下面的样子:

d360dda293012406071d473d51668251.png

这个数是多少?会是0吗?我们来分析一下:首先最左边的符号位从0变成了1,所以可以肯定,这个数是个负数。那么一个正数做了加1的操作,它应该变成一个更大的正数,现在怎么变成负数了呢?我们必须清楚,原来这个数的符号位是0,是因为加法运算产生了“进位”,才使得符号位变成了1,但是,计算机不管那么多,它只要看到最左边的符号位是1,就认定这是一个负数。那么,这个负数的值是多少?我们可以按照补码表示负数的规则,以逆运算的方式求出它的绝对值,就知道这个负数的值了。

前面讲过:用补码表示负数的算法分两步进行,其中第二步,是在二进制数字上加1。那么反过来,这个过程的逆运算也要分两步进行。其中第一步就应该是在原负数补码的数字上减1,减1之后,刚才的数字就会变成下面的样子

2483a4ffeadc91a333e0e0ba13eeab39.png

补码求负数的第一步是对二进制数字按位取反,所以逆运算的第二步也是对各个位上的数字(连同符号位上的数字在内)按位取反,使得各个位数字恢复到原来的值。经过按位取反之后,刚才二进制数字又会变成下面的样子

73561960d2ae4f865a34b2a0c3a5e0f1.png

细心的读者可能已经发现,折腾了半天,又回到了逆运算之前的样子!大家注意:表面上,这个二进制数跟逆运算之前是一个样,但是它的意义已经完全不同了。在进行逆运算之前,这个二进制数是一个补码形式表示的负数,而经过逆运算之后,这个二进制数变成了一个绝对值,既然是绝对值,它肯定不会是负数。因此,这个二进制数最前面的1并不表示负数,而是数字的一部分。那么这个绝对值是多少呢?转换成十进制就是2147483648。所以,我们图3中看到的那个“1开头后面跟着31个0”所表示的负数,就是-2147483648!

到此为止,我想大家已经明白为什么程序的运行结果是-2147483648了吧?可能有一部分读者会问:补码当中,“1开头后面跟着31个0”这个数字为什么不能解释为:符号位上的1表示负数,后面的31位数字表示0,这样形成的数字是-0,也就是0呢?其实,补码的运算规则中特意强调了这一点。规则强调:补码当中,对于0只有唯一一种表示形式,那就是32个0,其中最前面的0表示符号,后面的0表示数字。一旦遇到符号位是1,后面全是0的情况,必须按负数对待!既然要求我们按负数对待,那就必须通过逆运算来计算这个负数的绝对值。而我们计算得到的这个负数的绝对值就是2147483648。-2147483648是int类型的所能表示的最小值。因此,int类型数据的最大值再加1,一下子就变成了int类型的最小值,我们可以戏称为“物极必反现象”。

那么,Java语言当中,其他三种类型的整数是否也有“物极必反现象”呢?对于long类型的变量来讲,也存在这种现象,而对于byte和short类型,我们使用其最大值和1进行加法运算,无法再赋值给byte和short型的变量,因为这种操作在编译时就会报错。关于byte和short变量无法完成这种赋值操作的原因,大家可以看《Java语言中为byte和short类型变量赋值为啥会报错?看完秒懂》进行详细了解。

另外,通过这个例子,大家也应该明白为什么Java语言中,整数类型的表示范围是不对称的。比如, byte类型的数据最大值是是127,而最小并不是-127,而是-128。其原因就是补码规则中,把0当作了正数看待,这样的话正数这边有个0,而负数那边没有,从而表示范围不对称。

看短文,涨姿势,如想系统学习Java编程,点击下方的“了解更多”即可,不让你进去,用QQ登录就可以啦!有问题也可以加入我的QQ群一起讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

极乐科技CEO应邀出席2017微信小程序生态课

2019独角兽企业重金招聘Python工程师标准>>> 1月9日凌晨小程序正式上线。张小龙第一时间在其朋友圈写下一个日期—2007.1.9,并配上iPhone发布会的图片,微信小程序如约而至。在兴奋之际,极乐科技的大咖们也在思考:专注于…

IOS13图标尺寸_更新iOS13后,我的5台iPhone都废了

苹果就是自带热搜体质,特别是在九月。机哥大概数了一下,光是线下发售后的这四天,iPhone 11 前前后后就上了 7 次热搜。今天这一次热搜,是因为库克之前发了一条微博,夸自家 iPhone 11 是有史以来最出色的一款。在这条微…

数据库收缩

1.选中数据库-任务-收缩-数据库 2.全部压缩 3.右键数据库,属性 4.找到自动收缩,设置为true 转载于:https://www.cnblogs.com/RogerLu/p/10469819.html

flink sql udf jar包_Flink 生态:一个案例快速上手 PyFlink

简介: Flink 从 1.9.0 版本开始增加了对 Python 的支持(PyFlink),在刚刚发布的 Flink 1.10 中,PyFlink 添加了对 Python UDFs 的支持,现在可以在 Table API/SQL 中注册并使用自定义函数。PyFlink 的架构如何…

编程软件python是什么意思_程序员Python编程必备5大工具,你用过几个?

Python是编程入门不错的选择,现在也有不少的程序员业余时间会研究这门编程语言。 学习Python有时候没有第一时间找到好工具,会吃不少的苦头。毕竟好的工具能将工作效率多倍速提升。下面W3Cschool给小伙伴们推荐Python编程必备的5大工具: 0、I…

Linux ReviewBoard安装与配置

目录 0. 引言1. 安装步骤2. 配置站点 2.1 创建数据库2.2 开始安装2.3 修改文件访问权限2.4 Web服务器配置2.5 修改django相关配置正文 回到顶部0. 引言 环境:Ubuntu 14.04 Server(虚拟机) 这篇文章里说的是review board官方的安装方式&#x…

又拍云 php5月18号那,又拍云文档中心

移动流量平台概述又拍云手机流量营销平台,整合移动、电信、联通三大运营商流量资源,将强大的流量营销服务,通过接口等形式提供给商家合作伙伴,帮助商家开展品牌宣传、APP/游戏/微信公众号/网站的拉新与促活等多种营销活动。通过接…

SQL SERVER2000将多行查询结果拼接到一行数据及函数的创建

处理前的查询结果如上图: 通过借助SQL变量的定义 DECLARE Scope varchar(1000) DECLARE Num int SET Scope SET Num 1 SELECT ScopeScopeconvert(varchar(8),Num)、DescScope DescOper;, Num Num1 From fuel_contractQualityNew Where ContractID0120090001…

windows nginx c++读取请求数据_轻松应对百万并发的Nginx,搞懂LinuxC/C++这些技术栈升职加薪...

在深入了解 Nginx 各种原理及在极端场景下的一些错误场景处理时,需要首先理解什么是网络事件。Nginx 是一个事件驱动的框架,所谓事件主要指的是网络事件,Nginx 每个网络连接会对应两个网络事件,一个读事件一个写事件。在深入了解 …

如何成为一位牛逼的高手

郑昀 演讲稿 创建于2016/9/15 最后更新于2016/9/21 很多人都在思考一个问题: 怎样才能想出来一个牛逼的 idea? 有一位喜欢抽烟喝酒烫头的大师 给出了答案: 这事儿吧,简单,一共分两步。 第一步先让自己成为一个牛逼的人…

Python dict() 函数

Python dict() 函数 Python 内置函数 描述 dict() 函数用于创建一个字典。 语法 dict 语法: class dict(**kwarg) class dict(mapping, **kwarg) class dict(iterable, **kwarg) 参数说明: **kwargs -- 关键字mapping -- 元素的容器。iterable -- 可迭代…

贝塞尔曲线:原理、自定义贝塞尔曲线View、使用!!!

一、原理 转自:http://www.2cto.com/kf/201401/275838.html Android动画学习Demo(3) 沿着贝塞尔曲线移动的Property Animation Property Animation中最重要,最基础的一个类就是ValueAnimator了。Property Animation利用ValueAnimator来跟踪记录对象属性已…

python数据分析与基础实战_《python数据分析与挖掘实战》基础概念

数据建模.png 数据挖掘的基本任务:利用分类与预测、聚类分析、关联规则、时序模式、偏差检测、智能推荐等方法,帮助企业提取数据中蕴含的商业价值,提高企业竞争力。 数据探索:异常值分析、缺失值分析、相关分析和周期性分析。 数据预处理:数据…

简述JAVA线程调度的原理,Rxjava原理(二)--线程调度

1. 创建线程池和线程管理策略分析// 在开发中使用Rxjava来完成线程切换会调用到以下方法(还有几个就不一一列举了,原理一样的),那么就从这里开始分析Schedulers.io()Schedulers.computation()Schedulers.newThread()AndroidSchedulers.mainThread()当我们…

不同的模块中定义同样的宏为不同的值合法吗_如何创建自定义的建模规范

本文摘要:主要介绍如何创建自定义的建模规范检查,以及在建模规范检查中,如何增加自动修正模型使之符合规范。比如我们想创建一个自定义的规则,对于constant模块,1. 如果value是参数的话,则输出数据类型必须…

wsdl文件是怎么生成的_C++ 动态库.dll的生成---超级详细!!!

怎么将建好的工程生成.dll工程?1、在C中打开工程2、运行结果:输出Print修改开始:1、打开属性。2、修改以下内容:目标文件扩展名,由.exe--》.dll,直接删除修改即可配置类型,由.exe--》.dll,下拉菜单可选择最…

HTTP基本认证(Basic Authentication)的JAVA示例

大家在登录网站的时候,大部分时候是通过一个表单提交登录信息。但是有时候浏览器会弹出一个登录验证的对话框,如下图,这就是使用HTTP基本认证。下面来看看一看这个认证的工作过程:第一步: 客户端发送http request 给服务器,服务器验证该用户…

python能print中文吗_python怎么print汉字

今天就为大家分享一篇python中使用print输出中文的方法,具有很好的参考价值,希望对大家有所帮助。看Python简明教程,学习使用print打印字符串,试了下打印中文,不行。(推荐学习:Python视频教程&a…

oracle 11gogg,【OGG】Oracle GoldenGate 11g (二) GoldenGate 11g 单向同步配置 上

Oracle GoldenGate 11g (二)GoldenGate 11g 单向同步配置 上ItemSource SystemTarget SystemPlatformRHEL6.4 - 64bitRHEL6.4 - 64bitHostnamerhel64.oracle.comora11g.oracle.comDatabaseOracle 11.2.0.3Oracle 11.2.0.3Character SetAL32UTF8AL32UTF8ORACLE_SIDPRODEMREPList…

Centos7-卸载自带的jdk 安装jdk8

卸载JDK Centos7一般都会带有自己的openjdk,我们一般都回用oracle的jdk,所以要卸载 步骤一:查询系统是否以安装jdk #rpm -qa|grep java 或 #rpm -qa|grep jdk 或 #rpm -qa|grep gcj 步骤二:卸载已安装的jdk #rpm -e --nodeps java-1.8.0-openjdk…