前言
- 笔者在初学Java SE时,发现基本数据类型内涵玄机,于是动用拙笔粗略写下学习心得
- 若文中有表述不严谨之处,还望各位指出!
前置知识
- 各存储单位之间的关系:
- 1 byte(字节)=8 bit(比特)
- 1 KB = 1024 bytes
- 1 MB = 1024 KB
- 1 GB = 1024 MB
- 1 TB = 1024 GB
- 1 PB = 1024 TB
- 计算机底层的所有数据都是采用补码形式存储的,而输出是原码形式
- 对于数字形式的字面量,最高位用于符号位,0为正,1为负
- 于正数而言,反码以及补码与原码形式相同,都以字面量的二进制形式存储
- 于负数而言,
- 原码:十进制负数求绝对值,最高位修改为1
- 反码:在原码基础上符号位不变,其他位取反
- 补码:在反码基础上,符号位不变,加1
基本数据类型有哪些?
- 整数类型有以下:
- byte,占据1个字节,即8个bit
- int,占据4个字节
- short,占据2个字节
- long,占据8个字节
- 浮点数类型如下:
- float,占据4个字节
- double,占据8个字节
- 布尔类型如下:
- boolean,占据1个字节
- 字符类型如下:
- char,占据2个字节
- String是引用数据类型,故在此不讨论
哪些数据类型需要特别关注?
- byte的取值范围 -128~127
- boolean只有true和false两种表现形式
- char和short都只占据一个字节,取值个数相同(65536个),但取值范围不同
- char虽然是字符型,但经过对应的字符编码后会转换为对应的二进制位,所以其底层也是二进制。其取值范围 0~65535
- short取值范围 -32768~32767
- 之所以会有如此差别,是因为字符型不是数字形式的字面量,无正负之分
- float和double
- 当需要存储现实世界的无限位数数据时,计算机只会存储近似值,不会全盘存储,不用双等号判断,利用比较符
- 有两种表现形式
- 十进制,例如0.32
- 科学计数法,例如32E-2也是0.32
- 浮点型数据的底层存储也和其他类型不同,以单精度(float)为例
- 符号位,1位
- 指数位,8位 (又称偏移量,最大偏移量位为127)
- 尾数位,23位 (小数部分的有效数字)
- 指数级增长,故而其存储容量大于占据8个字节的long
- char参与的运算
- 不允许直接定义空字符型变量,而是'\u0000'(\u之后跟十六进制数字,是某个字符的编码)
- 在给字符型变量赋值时,若为整数型,则默认作为ASCII码值处理
- 做数学运算时,先转换为容量大的数据类型再做运算(多种数据类型做运算)
- 语法规则:当 byte,short,char做混合运算时,各自先转换为int类型再做运算
- 数据类型的默认值
| 数据类型 |
默认值 |
说明 |
| int/byte/short |
0 |
|
| long |
0L |
|
| float |
0.0F |
|
| double |
0.0 |
|
| char |
\u0000 |
空字符 |
| boolean |
false |
|
Java编译器的“小心思”
- 多数据混合运算时,各自先转换为容量最大的类型再做运算
- 当运算符两边都是字面量时,其运算会在编译阶段完成(优化),当运算符两旁是变量时,则在运行阶段运算(注意优先级)
- 如果字面量没有超出需要被赋值的变量的取值范围,则无误
在Java中如何将对应进制转换为十进制?
// 十进制(10)
int a = 10;
// 二进制(2)
int b = 0b10;
// 八进制(8)
int c = 010;
// 十六进制(16)
int d = 0x10;
关于数据类型之间的转换
常见转义字符
- 注意:转义字符不是字符串,而是斜杠后的字符对应的特别行为!
// \t 制表符
// \n 换行
// \" 双引号
// \' 单引号
// \\ 斜杠(字符串类型时,输出单斜杠时)
// 前后引号匹配时,优先最近的