06-Java 中的基本数据类型
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. 学员提问
为什么 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的自动类型转换,低精度的数字可以赋值给高精度的数字。这部分内容在"基本数据类型的更多语法点"有讲述.
老师,大的整数是因为超过了默认的整数类型 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。
关于 char 类型,理解其表示所有值域内的任意一个字符,但文稿中后半句“值域是所有字符(最多65535个)”是什么意思?
作者回复:
这个是从两个方面理解,首先是从 char 的本意。char 的本意是要表示一个字符,只要是计算机里有的字符,char 都能表示。 最多 6 万多个,是从 char 的存储层面理解。char 是两个 byte 组成的,所以最多也就只能表示 6 万多个数字,也就是最多只能表示六万多个字符。当然我们也不用担心这个事情,六万多个是足够我们用了的。
老师你好,java 中有这么多数据类型(byte、short、int、float、double),而且都是从小到大包含的,后面写程序的时候所有的数字类型的数据都统一用 double 是不是可以,这样做有什么劣势?盼复,谢谢~
作者回复:
double 的问题在于无法精确的比较。而且有些场景可能会出现精度问题,比如本来应该是 3,结果double 变成了 2.9999999999 这都是有可能的。
由此造成的问题就是,要比较两个 double 的值很繁琐,要用两个 double 的数字相减,然后看差值的绝对值是不是小于一个对于业务足够可以忽略。
比如对于表示钱的两个 double 数字,差的绝对值如果小于 0.001,也就是一厘,那就可以认为是相等的。 如果业务上是整数,尽量用 int 或者 long。比如表示手机的个数,汽车的个数等。
欢迎关注我公众号:AI悦创,有更多更好玩的等你发现!
公众号:AI悦创【二维码】
AI悦创·编程一对一
AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh
C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh
方法一:QQ
方法二:微信:Jiabcdefh
- 0
- 0
- 0
- 0
- 0
- 0