一、数据溢出现象分析
DEMO:如果超过了int类型的最大值或者最小值的结果是什么呢?
发现了最大值加一之后变成了最小值,最小值减去一之后变成了最大值,这种现象叫做数据溢出(不要和内存溢出搞混淆了),在开发中一般不会出现的,只是作为面试的一个概念提出来。如果要让数据不溢出应该提升精度(也叫做扩大数据类型)。 下面我们分析数据溢出的原因,那么要分析这个问题就得从“-2147483648”和 “2147483647”的原码说起。 DEMO:开始分析 ·2147483647的原码
此时按照正常的逻辑应该需要33个比特位才能表示我们加一后的数据了(必须有一个符号位),但是java中int类型的数据只能是32位(包括符号位),如果最大值+1或者最小值-1,那么符号位将参与计算(原来的符号位无效了),计算之后符号位的结果任然作为符号位。 int类型的最小值减去一个正数会变成为一个正数的原理也是和上面一样的,就不重复分析了! 总结:1、数据溢出的现象是符号位的变化而导致(抛弃了原来的最高位) 2、二进制的加法是逢二进一 3、二进制的减法,1-1=0,1-0=1,0-1=1(此时不够要向高位借一当二用)。
|