Java千问:你真的会用Java的int型变量吗?有些坑你真的不知道

咱们在进行Java编程的时候,使用最频繁的数据类型基本上就是int型了。平时在使用这种数据类型的过程当中,咱们彷佛也并无感受到有什么太多须要注意的地方,其实int类型的变量在使用过程当中也会有一些隐藏很深的坑,咱们经过一篇短文来了解一下。
首先咱们先来明确一下Java虚拟机在对int型数据进行处理时默认的两条规则编程

  1. 当程序出现“整型常量”的时候,默认都是以int型存储的
  2. 若是算术表达式中出现的全部的数字都是int型的,默认运算结果也是int类型
    了解了这两条基本规则以后,咱们接着往下看。在程序编译过程当中,编译器只对“直接出现”的int常量进行数据超范围检查,而对“运算产生的int型值”并不进行超范围检查。这句话是什么意思呢?咱们来看下面的代码
    Java千问:你真的会用Java的int型变量吗?有些坑你真的不知道
    咱们使用数字2200000000给long类型的变量x赋值,2200000000其实并无超过long类型数据的范围,可是编译器却认为这条语句有语法错误,为何呢?刚才咱们强调过:当程序出现“整型常量”的时候,默认都是以int型存储的,这个2200000000就是一个“整型常量”,因此编译器会把它看成int型数据来看待,尽管它最终被赋值给了long类型的变量。刚才说过,编译器会对“直接出现”的int常量进行数据超范围检查,这个2200000000就是“直接出现”在程序中的,而且还被看成了int型,因此编译器要对其进行检查,经检查发现这个数字已经超过了int型的表示范围,因此会报错。
    修改这个错误的办法也很简单,只要在2200000000后面加一个字母L就可让它转换为long类型数据,这样语法错误天然消失。那么,既然编译器已经已经用如此明显的形式给咱们报错,咱们固然能排除掉错误,可是对于编译器不报错的状况,咱们颇有可能就会“掉坑”,来看下面的代码:
    Java千问:你真的会用Java的int型变量吗?有些坑你真的不知道
    咱们但愿计算一天有多少微秒(1秒=1百万微秒),因而咱们给出了上面的计算公式,而且考虑到计算结果会超过int类型的表示范围,咱们很当心的把计算结果保存到了一个long类型的变量当中。首先明确,这个计算结果是86400000000,它并无超过long类型数据的表示范围,可是,运行结果以下图,是一个彻底错误的数值
    Java千问:你真的会用Java的int型变量吗?有些坑你真的不知道
    这是为何呢?刚才已经强调过:算术表达式当中,若是所有是int类型的数据进行运算,那么运行结果也是int类型的。如今程序中的算术表达式就是典型的这种状况:所有由int类型的数据参与运算,因此运算结果也是int类型的。虽然明白了这个道理,可是仍是没说清楚计算结果为何如此“不靠谱”。解释这个现象,就必须用到咱们刚才所说的一条规则:编译器对“运算产生的int型值”并不进行超范围检查。在运算过程当中,由于所有数据都是int型,因此每一步运算结果都会被保存到一个int型的临时变量当中。可是由于每一步的运算结果都不是“直接出现的数字”,因此编译器对每一步运算结果都不作超范围检查,那么,算着算着,相乘的结果不知不觉就已经超过了int类型的表示范围,虽然超过了范围,但编译器坐视不理,仍然进行赋值。把一个超范围的数据赋值给int型的临时变量会致使“溢出”现象,也就是说,运算结果超范围的高位部分被丢弃了,只保留了低位数据,从而致使产生了一个错误结果。因此,咱们不能简单认为理论上的计算结果86400000000没有超过long类型数据的表示范围,就能够直接把这些int型数据直接进行相乘并赋值。消除这个程序错误的方法也很简单,就是把乘法表达式当中任意一个乘数因子的后面加上字母L,使其变成一个long类型的数据就能够了。一旦编译器发现有long类型的数据参与了运算,就不会把运算结果看做是int型,而是自动提高为long类型。这样就不会出错了。
    关于int型数据,还有一个隐藏很深的大坑,你们来看代码
    Java千问:你真的会用Java的int型变量吗?有些坑你真的不知道这个循环看似只能执行101次,其实它是一个无限循环(死循环)!缘由就是2147483647是int类型数据所能表示的最大值,而循环变量i在到达最大值之后,再进行加1操做,获得倒是-2147483648!这致使i永远都会知足循环条件,从而使看起来有限次数的循环变成了无限。至于为何在int型最大值的基础上再加1会变成-2147483648,你们能够看个人另外一篇博文《Java千问:Java语言中最大的整数再加1等于多少?》,这里就不详细解释了。看完这篇文章以后,是否是有一种被惊出一身冷汗的感受呢?因此千万不要小看一个简单的int类型哟!**
相关文章
相关标签/搜索