Java中的基本数据类型int及数据溢出

1. 概述
Java语言内置了八种基本数据类型:六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

其中int 数据类型是++32位++、++有符号++的以++二进制补码++表示的整数

最小值是 -2,147,483,648(-2^31);
最大值是 2,147,483,647(2^31 - 1);
一般的整型变量默认为 int 类型;
int的默认值是 0

public class Test {  
    public static void main(String[] args) {
        System.out.println("二进制长度:" + Integer.SIZE); 
        System.out.println("最小值Integer.MIN_VALUE = " + Integer.MIN_VALUE); 
        System.out.println("最大值Integer.MAX_VALUE = " + Integer.MAX_VALUE);  
    }//欢迎加入Java开发交流君样:909038429
}

输出结果:

二进制长度:32
最小值Integer.MIN_VALUE = -2147483648
最大值Integer.MAX_VALUE = 2147483647

2. 补码
Java里的int是有符号的,二进制系统是通过补码来保存数据的,最高位为1的数字用来表示负数,而最高位为0的数字表示非负数。

正数补码等于原码,负数的补码等于其绝对值的反码+1。例如:-1的补码就是绝对值1的反码(按位取反) 再+1。计算方式如下:

  0000 0000 0000 0000 0000 0000 0000 0001      => 1的二进制
  1111 1111 1111 1111 1111 1111 1111 1110      => 1的反码
+ 0000 0000 0000 0000 0000 0000 0000 0001
-----------------------------------------
  1111 1111 1111 1111 1111 1111 1111 1111      => -1的补码

常见整数对应的补码:

1000 0000 0000 0000 0000 0000 0000 0000 => -2147483648
1111 1111 1111 1111 1111 1111 1111 1111 => -1
0000 0000 0000 0000 0000 0000 0000 0000 => 0
0000 0000 0000 0000 0000 0000 0000 0001 => 1
0111 1111 1111 1111 1111 1111 1111 1111 => 2147483647

例:获取整数二进制

public class Test {
    public static void main(String[] args) {
        int[] arrayInt = new int[] {Integer.MAX_VALUE, 0, 1, -1, Integer.MIN_VALUE};
        for (int x : arrayInt) {
            String binaryString = Integer.toBinaryString(x);
            int length = Integer.SIZE;
            while(binaryString.length() < length){
                // 在不足的位数前加“0”
                binaryString = "0" + binaryString;
            }
            // 为了方便查看,每4位插入分割符
            int m = binaryString.length()/4 - 1;
            StringBuffer stringBuffer = new StringBuffer(binaryString);
            for (int i = m; i > 0; i--) {
                int j = 4 * i;
                stringBuffer.insert(j,' ');
            }
            System.out.printf("%,14d", x);
            System.out.print(" 对应的二进制为:");
            System.out.printf("%s%n", stringBuffer.toString());

        }//欢迎加入Java开发交流君样:909038429
    }
}

输出结果:

 2,147,483,647 对应的二进制为:0111 1111 1111 1111 1111 1111 1111 1111
             0 对应的二进制为:0000 0000 0000 0000 0000 0000 0000 0000
             1 对应的二进制为:0000 0000 0000 0000 0000 0000 0000 0001
            -1 对应的二进制为:1111 1111 1111 1111 1111 1111 1111 1111
-2,147,483,648 对应的二进制为:1000 0000 0000 0000 0000 0000 0000 0000

3. 数据溢出
首先,基本的数据类型(long,int,short,byte,char,float,double)都有自己能够保存的数据范围。

数据溢出:

当某一种类型的数值已经达到了此类型能够保存的最大值之后,再继续扩大,或者达到了最小值后再继续缩小,就会出现数据溢出问题。而溢出不会出错,却会得到一个意外的结果:

public class MyDemo{
    public static void main(String args []){
        int a = Integer.MAX_VALUE;//定义一个int型变量a的值为int型能够保存的最高值
        System.out.println(a + 1);
        int b = Integer.MIN_VALUE;//定义一个int型变量a的值为int型能够保存的最小值
        System.out.println(b - 1);
    }
}

输出结果:

-2147483648
2147483647

下面解释出现这种情况的原因:

  0111 1111 1111 1111 1111 1111 1111 1111      => 2147483647的补码
+ 0000 0000 0000 0000 0000 0000 0000 0001
-----------------------------------------
  1000 0000 0000 0000 0000 0000 0000 0000      => -2147483648的补码

最轻微的上溢是 INT_MAX + 1 :结果是 INT_MIN。
最严重的上溢是 INT_MAX + INT_MAX :结果是 -2。
最轻微的下溢是 INT_MIN - 1 :结果是 INT_MAX。
最严重的下溢是 INT_MIN + INT_MIN :结果是 0。
最大值加1时,反而变成范围的最小值,加2变成范围的次小值,这种情况可以想象出一个循环。

数据溢出的解决办法:

我们已经知道,在整型中,能够保存的数值范围最大的是long型;在浮点型中,能够保存的数值范围最大的是double型。所以在遇到数据溢出问题时,我们可以先把能够保存的数值范围小的类型转换为范围大的类型,再进行运算。

例:

public class Test{
    public static void main(String args []){
        //定义一个int型的最大值
        int x = Integer.MAX_VALUE;
        System.out.println((long)x+2);
    }
}

输出结果是:2147483649

image

最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:909038429
/./*欢迎加入java交流Q君样:909038429一起吹水聊天

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容

  • 目录:1.基本数据类型2.引用数据类型 数据类型: Java语言是一个强类型语言 1.所有变量,必须先声明类型...
    Ansaxnsy阅读 994评论 0 7
  • 变量作用就是申请内存来存储值,也就是说,创建变量的时候,需要在内存中申请空间。内存管理系统就是根据变量的类型为变量...
    南风_001阅读 250评论 0 0
  • 变量申请内存来存储值。当创建变量的时候,需要在内存申请空间。内存管理系统根据变量的类型为变量分配存储空间,分配的空...
    持之以蘅阅读 298评论 0 1
  • Java语言提供了八种基本类型。六种数字类型(四个整数型(默认是int 型),两个浮点型(默认是double 型)...
    轝巐阅读 1,578评论 0 1
  • 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间.内存管理系统根据变量的类型为变量分配存...
    海人为记阅读 439评论 0 0