企业电子商务网站建设的必要性,网站同步到新浪微博,网站建设 服务质量保证,商务汽车网站建设短文涨姿势#xff0c;看了不白看#xff0c;不关注等啥#xff1f;已知Java语言中int类型所能表示的最大整数为2147483647,请问以下代码执行结果是什么#xff1f;一部分人都会认为这段程序压根就无法通过编译#xff0c;也有人认为#xff0c;这段程序能够通过编译看了不白看不关注等啥已知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之后刚才的数字就会变成下面的样子补码求负数的第一步是对二进制数字按位取反所以逆运算的第二步也是对各个位上的数字(连同符号位上的数字在内)按位取反使得各个位数字恢复到原来的值。经过按位取反之后刚才二进制数字又会变成下面的样子细心的读者可能已经发现折腾了半天又回到了逆运算之前的样子大家注意表面上这个二进制数跟逆运算之前是一个样但是它的意义已经完全不同了。在进行逆运算之前这个二进制数是一个补码形式表示的负数而经过逆运算之后这个二进制数变成了一个绝对值既然是绝对值它肯定不会是负数。因此这个二进制数最前面的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群一起讨论