Talk is cheap , show me your code!
欢迎来到付振南Java博客,让我们一起学习Java吧!

由一道面试题引发的Java基本数据类型(int) int的取值范围,你知道吗?

今天做错了一道很基础的题目,哎,看来还是基础没打牢啊,话不多说,直接上题。
假设有如下程序:


public class Demo {
public static void main(String args[]) {
int num = 2147483647 ;
num += 2 ;
System.out.println(num) ;
}
}

最终的执行结果是什么?

  • A. -2147483648
  • B. 2147483649
  • C. -2147483647
  • D. 2

我想,大多数人会毫不犹豫的选择B选择,2147483649,直接+2吗,这还不简单吗?少部分同学仔细看了选项之后,发现事情没有这么简单,AC选项竟然是负的,思考许久后还是能选对的。

读一遍题,看一下选项,很明显,这道题考察的是Java基本数据类型中的int类型,完全就是看你基础扎不扎实了。

因为Java的多平台移植性,整型的范围与运行Java代码的机器无关,int类型占4个字节,也就是32位,可得int类型的取值范围是-2147483648 ~ 2147483647,所以再来看选项,可能聪明的同学一下就知道了这道题选择C选项-2147483647,可能还是会有很多同学像我一样一下子反应不过来,还是需要在纸上算一下,并且自己敲代码验证一下。

接下来我从计算机组成原理的原码补码反码来讲解一下这道题。首先我们看num的值为2147483647,换成二进制表示方法如下图所示。

注意看,此时加完long类型的2之后,得到的数的最高位变成了1,由于正数的最高位用0表示,负数的最高位用1表示,所以得到的这个数显然是负数了,但是到这还没有结束,在计算机中,负数的二进制采用补码方法来计算,也就是最高位不变,其余按位取反+1。所以该数的补码如下图所示。

最后我们把该二进制数转换成十进制数就是最后的结果了,最高位符号位不参与计算,1就是负数,后面有31个1,为了方便计算,我们给它+1,所以变成了32个1,也就是3的31次方,由于加了1,我们得减回去,所以最终结果就是负的2的31次-1,也就是-2147483647,所以这道题选择C选项。

最后我们敲代码验证答案,如下图所示。

举一反三,这道题,会做了之后,我们再来看几道变形题。
假设有如下程序:

public class Demo {
public static void main(String args[]) {
int num = 2147483647 ;
long temp = num + 2L ;
System.out.println(num) ;
}
}

最终的执行结果是什么?
我们一定要看清楚题,题目打印输出的是num,所以结果还是2147483467。我们如果打印输出的是temp,那么结果就是2147483649,因为temp是long类型的,long类型占八个字节也就是64位,很显然并没有超出long类型的取值范围。

最后,我们来总结一下,这道题并不难,考的都是基础,int的取值范围,负数的二进制表示方法,只要我们细心一点,大家都能做对这道题。

赞(4) 打赏
未经允许不得转载:付振南Java博客 » 由一道面试题引发的Java基本数据类型(int)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏