当前位置:首页 > 天道酬勤 > 正文内容

()

张世龙2021年12月20日 21:29天道酬勤390

提高短句的姿势、看也没有用、不关注等是什么?

已知可以用Java语言的int类型表示的最大整数为2147483647,以下代码的执行结果如何?

有些人认为这个程序不能编译。 另外,虽然这个程序可以编译,但是在运行时会抛出例外,但是很多人觉得面对这个主题也无能为力。 那么正确答案是什么呢? 首先,我要告诉你,这个程序已经成功编译,运行时也不会发生异常。 执行结果将数字输出到控制台-2147483648! -2147483648是可以用Java语言的int类型表示的最小整数。

这个运行结果可能会吓到很多人,但运行结果为什么是这样的呢? 要理解其原理,首先必须明确Java语言中数字的表示和存储方法。

如您所知,这两个数字都存储在计算机中,并以二进制格式存储。 在Java语言中,数字以补数的形式表示。 那么,补充代码是什么? 补数是指计算机用二进制数表示数字的规则。 那个算法很简单。 最左边的二进制位表示数字的正负,0表示正数,1表示负数。 表示符号的二进制位称为“符号位”,其余的二进制位表示数字本身。 对于用其余的二进制数表示数字的方法,正数和负数略有不同。 让我们先来谈谈正数。 正数时,用剩下的二进制位直接表示这个数字即可。 负数时,算法有点复杂,分为两个阶段。

首先,用补数表示该数的绝对值,然后按位数(包括符号位数的数字)反转各位的数字。 按位数反转是指,如果这个位数原来为0,则为1;如果原来的位数原来为1,则为0。

第二,将其反转后的数字加1,得到负数的补数表示结果。

不明白吗? 没关系! 我举个例子来说吧。 首先,在Java语言中,int型数据占4字节,但4字节能表现的最大整数是多少呢? 根据补数的约定,该最大整数必须是“1个0和31个1”才能存储在计算机中。

再加上1,遵循二进制进位规则,则:

这个数量是多少? 会变成0吗? 分析一下吧。 首先最左边的符号位从0变为了1,所以这个数肯定是负数。 如果进行了正数加1的操作,那应该是更大的正数,但是现在怎么会变成负数呢? 必须清楚的是,该数的符号比特为0是因为加法运算产生了“进位”,所以符号比特为1,但是,即使计算机没有那么多,只要看到最左边的符号比特为1,就认定为是负数那么,这个负值是多少? 根据用补数表示负数的规则,通过逆运算求出其绝对值,即可知道其负数的值。

如上所述,用补数表示负数的算法分两个阶段进行,其中第二个阶段是二进制数加一。 那么相反,这个过程的逆运算也必须分两个阶段进行。 的第一步是从原来的负补数数字中减去1,再减去1,然后刚才的数字应该是这样的

添加符号求负数的第一步是逐位反转二进制数字。 因此,逆运算的第二步也按位反转各位的数字(包括符号位的数字),使各位的数字恢复为原始值。 按位反转后,刚才的二进制数又如下

细心的读者可能注意到,经过长时间的辛苦,终于回到了逆运算前的样子! 注意:从表面上看,这二进制数与逆运算之前相同,但其含义完全不同。 在进行逆运算之前,这个二进制数是以补数表示的负数,但是进行逆运算之后,这个二进制数变成了绝对值。 既然是绝对值,就不会是负数。 因此,这个二进制数的开头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群一起讨论!

扫描二维码推送至手机访问。

版权声明:本文由花开半夏のブログ发布,如需转载请注明出处。

本文链接:https://www.zhangshilong.cn/work/25883.html

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。