AI悦创

V1

2022/10/29阅读:21主题:凝夜紫

06-Java 中的基本数据类型

你好,我是悦创。

原文首发:https://bornforthis.cn

1. 目录

  • 认识二进制
  • 数字的基本数据类型
  • 布尔和字符数据类型
  • 使用各种基本数据类型
public class BigNumber {
    public static void main(String[] args) {
        int bigNum = 9999999999;  // 会报错:java: 整数太大
        long number = 9999999999L;  // 解决方法
    }
}

从上面的代码,我们引出了几个问题:

  • long 是个什么东西?
  • L 又是什么东西?

这就是你要学习本届内容的原因!

2. 认识二进制

2.1 十进制

每一位可以是 0~9这 10 个值,到 10 进位。一百用十进制表示就是 100,十就是 10。

2.2 二进制

每一位可以是 0 和 1 这两个值,到 2 进位。一百用二进制表示就是 1100100,十就是 1010。

2.3 十六进制

每一位可以是 0~F 这15个值,到 16 进位。一百用十六进制表示就是 64,十就是 A。

2.3 bit 和 byte

Bit 意为“位”或“比特”,是计算机运算的基础,属于二进制的范畴; Byte 意为“字节”,是计算机文件大小的基本计算单位; 换算 1 Byte = 8 Bits【1B=8b】 1 KB = 1024 Bytes 1 MB = 1024 KB 1 GB = 1024 MB

  • 一个二进制的位叫做一个 bit。俗称小 b。宽带中的单位,都是小 b
  • 八个二进制的位,组成一个 byte,俗称大 B。硬盘等存储的单位,都是大 B
  • Byte 是计算机中基本的衡量存储的单位,计算机在对外使用时不会用小 b(bit) 作为划分存储的单位。

3. 数字的基本数据类型

3.1 整数类型

  • byte 占用 1 个 byte,值域是 -128~127
  • short 占用 2 个 byte,值域是 -32768~32767
  • int 占用 4 个 byte,值域是 -2147483648~2147483647。Java 中整数缺省是 int 类型
    • 【缺省:默认情况下,没有特殊指明类型下,Java 认为是 int】
    • 【缺省,即系统默认状态,意思与“默认”相同。】
    • 【“缺省”最初来源于计算机英文文档中的单词"default","default”有很多意思:违约、缺省、拖欠、默认,由于当时计算机方面的翻译水平不高,于是就把这个词直译成了“缺省”,其实应该取它的引申意思“默认”。后来的人们发现,无论怎么解释,缺省好像都说不通,但是由于之前的人们已经习惯了“缺省”这个用法,故依旧延续了这个用法。后来的新一辈的人们觉得说起来很拗口,就使用了"default”的引申意思,所以现在在大多数计算机技术文档或者软件里面,采用的都是意译之后的“默认”这个用法。】
  • long 占用 8 个 byte,值域是 -9223372036854774808~9223372036854774807

3.2 浮点(小数)类型

  • float 占用 4 个 byte ,有精度,值域复杂 ±340282346638528859811704183484516925440
  • double 精度是 float 的两倍,占用 8 个 byte。Java 中浮点数缺省是 double 类型。
public class FloatCalc {
    public static void main(String[] args) {
        System.out.println(1 / 3.0);  
        // 实际来说是无限循环小数,但是对 Java 来说能力有限只能显示/计算范围内的结果
        // 也可以说,计算机没有能力把这个无限循环表达出来。在它可能的存储空间里,只能保存到 0.3333333333333333
    }
}

3.3 符号位

用 byte 来举例子,一个 1 byte = 8 bit;2【二进制】 的 8 次方是 256,而有一个是符号位,所以最后是:128,也就是上面给出的范围。 参考:https://bornforthis.cn/posts/14.html

4. 布尔和字符数据类型

4.1 布尔和字符数据类型

  • boolean 占用 4 个 byte,值域是 true,false。
  • char 占用 2 个 byte,值域是所有字符(最多 65535 个)
public class BooleanAndChar {
    public static void main(String[] args) {
        System.out.println(1 < 2);  // true
        System.out.println(1 > 2);  // false

        System.out.println("ABC");
        System.out.println('A');  // 只能有一个字符
    }
}

5. 使用各种基本数据类型

  • 例程
  • L 后缀
  • 感受浮点数精度
  • 整数缺省是 int 类型,浮点数缺省是 double 类型
  • 编译错误的定位和修正

6. 代码实操

public class PrimaryTypes {
    public static void main(String[] args) {
        byte byteVar = 99;
//        byte byteVar = 128;  // 超出 byte 范围
        System.out.println(byteVar);

        short shorVar = -30000;
        System.out.println(shorVar);

        int intVar = 300000;
        System.out.println(intVar);

        long longVar = 99;

//        long bingLongVar = 9999999999;  // 缺省是 int,需要在末尾添加 L
        long bingLongVar = 9999999999L;  // 缺省是 int,需要在末尾添加 L
//        long bingLongVar = 9999999999l;  // 不推荐小 l,比如:11111111l,你能发现哪个是 1 哪个是 l 么?
        System.out.println(bingLongVar);

        float floatVar = 100.1f// 缺省是 double 需要在后面添加 f/F
//        float floatVar = 100.1; // 缺省是 double 需要在后面添加 f/F
        System.out.println(floatVar);
        /*
        * 解析:缺省是 double,也就是说浮点数会被自动识别为 double;
        * 但是你前面的变量被声明为 float 这样就和系统相冲突啦,就需要标明数字类型*/


        double doubleVar = 100.1;
        System.out.println(doubleVar);

        boolean condition = true;
        boolean fcondition = false;
        System.out.println(condition);

        char ch = 'A';
        System.out.println(ch);

        float floatVar1 = 100.1111111111f;
        System.out.println("floatVar1:>>>" + floatVar1);
        double dobleVar1 = 100.1111111111;
        System.out.println("dobleVar1:>>>" + dobleVar1);
    }
}
"C:\Program Files\Java\jdk-11.0.2\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2022.1.2\lib\idea_rt.jar=49882:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2022.1.2\bin" -Dfile.encoding=UTF-8 -classpath D:\Java_Coder\Coder06\out\production\Coder06 PrimaryTypes
99
-30000
300000
9999999999
100.1
100.1
true
A
floatVar1:>>>100.111115
dobleVar1:>>>100.1111111111

Process finished with exit code 0
import java.math.BigDecimal;

public class PrimaryTypes {
    public static void main(String[] args) {
        byte byteVar = 100;
        System.out.println(byteVar);

        short shortVar = 30000;
        System.out.println(shortVar);

        int intVar = 1000000000;
        System.out.println(intVar);

        long longVar = 80000000000L;
        System.out.println(longVar);

        float floatVar = 100.0000000666F;
        System.out.println(floatVar);

        double doubleVar = 100.0000000666;
        System.out.println(doubleVar);

        boolean booleanVar = true;
        System.out.println(booleanVar);

        char charVar = 'a';
        System.out.println(charVar);

    }
}

7. 技巧

  • IDE 快速输入:System._out_.println("");输入:sout

8. 学员提问

8.1 Q1

为什么 byte 和 short 后面不用加字母呢?我的理解是下面的,不知道对不对。 数字的默认类型是 int, byte 被包含在 int 里面吗?所以 long 的值在被包含在 int 的值中时可以不加 L,但是超出必须要加的。 long 的值在 int 类型中时,也是占用 8bit 的内存吗? java 编译器会对这种类型有优化吗?

回复:

作者回复: 为什么 byte 和 short 后面不用加字母呢? 是的, 编译器可以检查 byte 和 short 的值阈, 如果超出会报错。比如 byte b = 999; 这个更多的是 Java 编译器从易用性做的一种简化。如果每次给 byte 和 short 赋值,都要标明一下类型,会很繁琐。 后面的问题... 其实不存在 long 的值包含在 int 里面, 比如 long abc = 999; 这个过程其实是一种 Java的自动类型转换,低精度的数字可以赋值给高精度的数字。这部分内容在"基本数据类型的更多语法点"有讲述.

8.2 Q2

老师,大的整数是因为超过了默认的整数类型 int 的范围,所以要加个 L 表示 long 的数据类型,比如: long v1 = 99; //正确 long v2 = 9999999999999L; //正确 小的浮点数并没有超过默认的浮点数类型 double,为什么末尾要加 f 表示 float 数据类型呢,比如: float f1 = 1.1; //报错 float f1 = 1.1f; //正确

回复:

作者回复: Java 中的整数默认最多是 int 类型,比如 9,8,99999999,最多是 int 类型。再想向上,就要加个 L 后缀,就代表是 long 类型。 而浮点数默认是 double 类型,比如1.1,所以如果要给 float 赋值,要加个后缀 f 代表是 float 而不是double。

8.3 Q3

关于 char 类型,理解其表示所有值域内的任意一个字符,但文稿中后半句“值域是所有字符(最多65535个)”是什么意思?

回复:

这个是从两个方面理解,首先是从 char 的本意。char 的本意是要表示一个字符,只要是计算机里有的字符,char 都能表示。 最多 6 万多个,是从 char 的存储层面理解。char 是两个 byte 组成的,所以最多也就只能表示 6 万多个数字,也就是最多只能表示六万多个字符。当然我们也不用担心这个事情,六万多个是足够我们用了的。

8.4 Q4

老师你好,java 中有这么多数据类型(byte、short、int、float、double),而且都是从小到大包含的,后面写程序的时候所有的数字类型的数据都统一用 double 是不是可以,这样做有什么劣势?盼复,谢谢~

回复:

double 的问题在于无法精确的比较。而且有些场景可能会出现精度问题,比如本来应该是 3,结果double 变成了 2.9999999999 这都是有可能的。 由此造成的问题就是,要比较两个 double 的值很繁琐,要用两个 double 的数字相减,然后看差值的绝对值是不是小于一个对于业务足够可以忽略。 比如对于表示钱的两个 double 数字,差的绝对值如果小于 0.001,也就是一厘,那就可以认为是相等的。 如果业务上是整数,尽量用 int 或者 long。比如表示手机的个数,汽车的个数等。

AI悦创·编程一对一

AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh

C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh

分类:

后端

标签:

Java

作者介绍

AI悦创
V1

编程一对一教学,微信:Jiabcdefh