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,一经查实,立即删除!

相关文章

摆脱加卡他卡_如何通过三个简单的步骤摆脱“故事卡地狱”。

摆脱加卡他卡Your backlog is full of detailed user stories. Your team is no longer able to manage them, or rank them.您的待办事项列表中包含详细的用户故事。 您的团队不再能够对其进行管理或排名。 You wonder what the product you’re building is all about. The …

套接字结构

套接字编程简介 最近在看《UNIX网络编程卷一》,算是写的读书笔记吧. IPv4套接字地址结构 IPv4套接字地址结构定义在 < netinet/in.h > 头文件中.它以 sockaddr_in 命名.下面是它的结构体: struct in_addr {in_addr_t s_addr; 32位IPv4地址,网络字节序 …

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

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

蓝桥杯 基础练习 数列排序

http://lx.lanqiao.cn/problem.page?gpidT52 问题描述给定一个长度为n的数列&#xff0c;将这个数列按从小到大的顺序排列。1<n<200输入格式第一行为一个整数n。第二行包含n个整数&#xff0c;为待排序的数&#xff0c;每个整数的绝对值小于10000。输出格式输出一行&…

php 禁用通知,推送消息能不能区分禁止通知和卸载两种类型?

消息推送ios用了apns&#xff0c;android用的是gcm。推送失败都会返回无效的token&#xff0c;但是无效的tokne中&#xff0c;能不能区分到哪些是禁止通知&#xff0c;哪些是卸载app导致的呢&#xff1f;1 APNS PHP 的推送返回错误处理Push.php if (!empty($aMessage[ERRORS]))…

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

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

Android 如何调用系统默认浏览器访问

// 调用系统默认浏览器// 参考&#xff1a;// http://www.cnblogs.com/zhwl/archive/2011/11/15/2249848.html// https://segmentfault.com/a/1190000003912694case R.id.tv_about_weibo: // 关于微博// 直接打开 // Intent intent new Intent(); // …

kotlin函数式编程_我最喜欢的Kotlin函数式编程示例

kotlin函数式编程by Marcin Moskala通过Marcin Moskala One of the great things about Kotlin is that it supports functional programming. Let’s see and discuss some simple but expressive functions written in Kotlin.Kotlin的一大优点是它支持函数式编程。 让我们看…

数据库收缩

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

matlab自带kfcm函数,kfcmFun.m

function [center, U, obj_fcn] kfcmFun(data, cluster_n,maxit, kernel_b,expo)data_n size(data, 1); % 求出data的第一维(rows)数,即样本个数obj_fcn zeros(100, 1);% 初始化输出参数obj_fcnU initkfcm(cluster_n, data_n);% 初始化模糊分配矩阵,使U满足列上相加为1inde…

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

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

赛思互动:为什么越来越多的企业愿意接受SaaS服务?

SaaS是Software-as-a-Service&#xff08;软件即服务&#xff09;的简称&#xff0c;随着互联网技术的发展和应用软件的成熟&#xff0c; 在21世纪开始兴起的一种完全创新的软件应用模式。SaaS 应用软件的价格通常为“全包”费用&#xff0c;囊括了通常的应用软件许可证费、软件…

使用Google Cloud Platform分散您的应用程序

by Simeon Kostadinov通过Simeon Kostadinov 使用Google Cloud Platform分散您的应用程序 (Decentralize your application with Google Cloud Platform) When first starting a new software project, you normally choose a certain programming language, a specific frame…

pta通讯录排序用python实现,python实现将android手机通讯录vcf文件转化为csv

经常会遇到将手机通讯录导出到电脑并转化为在电脑中可编辑的情况&#xff0c;在网上搜索了很久当前不外乎两种处理方式。1.使用电脑的outlook的通讯簿功能&#xff0c;将手机导出的vcf文件导入到outlook的通讯录中&#xff0c;然后再导出为可编辑文件&#xff1b;2.是使用专用软…

从物联网发展历程看区块链挑战

2009年&#xff0c;中本聪发布了第一个比特币节点&#xff0c;五年后区块链俨然成为一个规模巨大的产业。 虽然看起来&#xff0c;基于区块链的新的商业时代距离我们似乎只有一步之遥&#xff0c;但在2016年&#xff0c;我们已经意识到区块链产业不会那么快获得成功。 早期的新…

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

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

Linux ReviewBoard安装与配置

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

小程序 graphql_GraphQL应用程序中的五个常见问题(以及如何解决)

小程序 graphqlby Sacha Greif由Sacha Greif GraphQL应用程序中的五个常见问题(以及如何解决) (Five Common Problems in GraphQL Apps (And How to Fix Them)) 了解如何释放GraphQL的强大功能而不会遭受缺点 (Learn to unlock the power of GraphQL without suffering its dr…

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

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

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

处理前的查询结果如上图&#xff1a; 通过借助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…