一、比特(bit)和字节(byte)
1、定义与换算关系
- 比特(bit)是计算机中
最小的数据单位
,表示二进制的一位,只能取0
或1
。其英文缩写为小写字母b
(如100b) - 字节(byte)是计算机中
基本的数据存储单位
,1字节由8个比特组成,即1 byte = 8 bit
。其缩写为大写字母b
(如100b)
单位 | 缩写 | 大小 |
---|---|---|
1 字节 | 1 byte (b) | 8 bit (b) |
1 千字节 | 1 kb | 1024 bytes |
1 兆字节 | 1 mb | 1024 kb |
1 吉字节 | 1 gb | 1024 mb |
1 太字节 | 1 tb | 1024 gb |
2、应用场景差异
- 比特通常用于衡量网络传输速率(如带宽)
- 例如100mbps(兆比特每秒)表示每秒传输的比特数,1兆 = 1,000,000(百万)
- 日常十进制换算:100mbps宽带的理论最高下载速度为100 ÷ 8 = 12.5 mb/s 100 ÷ 8 = 12.5 \text{mb/s}100÷8=12.5mb/s
- 使用二进制换算:100mbps宽带为100 , 000 , 000 ÷ 1024 ÷ 1024 ÷ 8 ≈ 11.92 mb/s 100,000,000 ÷ 1024 ÷ 1024 ÷ 8 ≈ 11.92 \text{mb/s}100,000,000÷1024÷1024÷8≈11.92mb/s
- 字节则用于表示数据存储容量或传输量
- 例如文件大小(如10mb)、内存容量等
- 下载速度也常用kb/s或mb/s表示
二、各类型详解
1、整数类型:byte、short、int、long
- 整数字面量默认类型为int
- 定义long类型常量须后加‘l’或‘l’后缀
- 必须加l/l:当数值超出int范围时
- 建议加l:即使数值在int范围内,也推荐添加大写l以提高代码可读性
- 避免使用l:防止与数字1混淆
- byte占用8个bit位,共28=256个表达方式,负数(128个):-1~-128;正数(128个):0~127
- byte和short常用于节省内存的场景,如处理文件或网络数据流
类型 | 位数 | 取值范围 | 默认值 | 包装类 |
---|---|---|---|---|
byte | 8 | -27 ~ 27-1(-128~127 ) | 0 | byte |
short | 16 | -215 ~ 215-1(-32768 ~ 32767) | 0 | short |
int | 32 | -231 ~ 231-1(约21亿多 ) | 0 | integer |
long | 64 | -263 ~ 263-1(-9223372036854775808 ~ 9223372036854775807) | 0l | long |
不同整数类型的存储空间和表示数值的范围:
2、浮点类型:float、double
关于精度举例说明:
float f = 0.123456789f; double d = 0.123456789123456789; system.out.println(f); // 输出:0.12345679(只有前 7 位是可靠的) system.out.println(d); // 输出:0.12345678912345678(保留了更多有效数字)
关于浮点型精度的说明:
- 并不是所有的小数都能可以精确的用二进制浮点数表示
- 二进制浮点数不能精确的表示0.1、0.01、0.001这样10的负次幂
3、字符类型:char
- java中的char类型是固定长度的2字节,即使是中文、英文或其他字符
- 常用汉字:在java内存中用一个char表示,占2个字节
- 扩展汉字(生僻字):超出char表示范围,用两个char表示,占4个字节
- 如果你将汉字以utf-8编码形式存储(如写入文件或通过网络传输),一个汉字通常会占用3个字节(生僻字可能是4个字节)
类型 | 位数 | 取值范围 | 默认值 | 包装类 |
---|---|---|---|---|
char | 16 | 0 ~ 65535(unicode) | ‘\u0000’ | character |
- char类型是可以
进行运算
的。因为char类型都对应有unicode码,可以看做是一个数值
char c12 = 'a'; // ascii对应数字97 char c13 = 65; // 这里就是ascii码65,对应字符a system.out.println(c12+c13); // 97+65=162
3.1、字符字面量(最常见)
最常见的写法,表示单个字符
//使用一对''表示,内部有且仅有一个字符 char c1 = 'a'; char c2 = '中'; char c3 = '1'; char c4 = '%'; char c5 = 'γ'; //编译不通过 //char c6 = ''; //char c7 = 'ab';
3.2、 unicode转义表示(\uxxxx 格式)
- ‘使用
\u
开头加4位十六进制
表示unicode编码 - 如下unicode表,
\u + 纵坐标 + 横坐标
如:\u0040
表示为@
3.3、 转义字符
- 常见控制字符,如换行、制表符等
转义字符 | 说明 | unicode表示方式 |
---|---|---|
\n | 换行符 | \u000a |
\t | 制表符 | \u0009 |
\" | 双引号 | \u0022 |
\' | 单引号 | \u0027 |
\\ | 反斜线 | \u005c |
\b | 退格符 | \u0008 |
\r | 回车符 | \u000d |
3.4、 整数转换
使用整数转换为对应的字符
char c = 65; // ascii 码 65 对应 'a' system.out.println(c); // 输出: a char ch = 0x4f60; // 十六进制 unicode 表示 '你' system.out.println(ch); // 输出: 你
4、布尔类型:boolean
类型 | 位数 | 取值范围 | 默认值 | 包装类 |
---|---|---|---|---|
boolean | 1 | true/false | false | boolean |
java 语言规范未强制规定 boolean 的大小,仅表示其表示 1 位信息,具体实现由虚拟机决定
。这导致不同 jvm 的差异:
- 通常占用 4 字节:根据《java 虚拟机规范》,单独使用的 boolean 值在编译时会被转换为int 类型(占用 4 字节),以提高 32 位处理器的存取效率。例如,局部变量或方法栈中的 boolean 变量可能按 int 处理
- 可能占用 1 字节:部分虚拟机(如 hotspot)在存储对象的成员变量时,可能将 boolean 字段压缩为 1 字节。例如,oracle 的某些 jvm 实现中,boolean 字段实际占用 1 字节
- 数组元素:统一为1 字节(编码为 byte 数组)
三、基本数据类型转换
1、自动类型转换(隐式转换)
- 将较小的数据类型转换为较大的数据类型(不会丢失信息)。由编译器
自动完成
- char与short同级,但不可直接转换,需强制转换
示例:
int a = 10; long b = a; // 自动转换:int → long double c = b; // 自动转换:long → double int x = 5; double y = x + 3.14; // 结果为 double 类型 char ch = 'a'; int code = ch; // 自动转换:char → int(输出 unicode 值 65)
2、强制类型转换(显式转换)
- 将大范围类型转换为小范围类型时,必须使用
强制类型转换
,可能会造成精度丢失
或溢出
精度丢失示例:
double d = 123.456; int i = (int) d; // 强制转换:double → int(结果为123,精度丢失)
精度溢出示例:
溢出
是指一个数值超出了该数据类型所能表示的范围,导致结果不正确
甚至反方向回绕
- 想象你有一个 3 位的计数器,只能表示 0 到 999,如果你加到 1000,它就回到了 000——这就是溢出
byte b = 127; // byte 的最大值是 127 b = (byte)(b + 1); // 加1后会溢出,结果是 -128 long l = 3000000000l; int j = (int) l; // 强制转换:long → int(溢出,结果为-1294967296)
3、不同数据类型运算
byte, short, char 运算 ➜ 自动变成 int
byte a = 10; byte b = 20; // byte c = a + b; // 编译错误:结果是 int int c = a + b; // 正确 //byte、short之间做运算 byte b3 = 12; short s1 = 10; //short s2 = b3 + s1; // 编译不通过 需要用int来接收 int i4 = b3 + s1; // 正确
int 与 long 运算 ➜ 提升为 long
int i = 1000; long l = 2000l; long result = i + l; // i 自动转为 long
int 与 float 运算 ➜ 提升为 float
int i = 5; float f = 2.5f; float res = i + f; // i 转为 float,结果是 7.5
float 与 double 运算 ➜ 提升为 double
float f = 3.5f; double d = 1.2; double res = f + d; // f 转为 double,结果是 4.7
到此这篇关于java 八种基本数据类型的文章就介绍到这了,更多相关java 八种基本数据类型内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论