| 数据类型 | 字节数 | 默认值 | 取值范围 | 备注 |
|---|---|---|---|---|
| byte (字节) | 1 | 0 | -27 到27 -1(-128 到 127 ) | |
| short(短整数) | 2 | 0 | ||
| int(整数) | 4 | 0 | ||
| long(长整数) | 8 | 0 | ||
| float(单精度) | 4 | 0.0 | ||
| double(双精度) | 8 | 0.0 | ||
| char(字符) | 2 | 0~65535 (\u0000~\ufffff) | 用单引号,unicode字符 | |
| boolean(布尔值) | 1 | false | true, false |
- 整数类型
- byte short int long
- 整数默认是int
- 声明long 要加 l(小写L) 或 L(大写L)
- 浮点数
- float double
- 浮点数在机器中存放形式为:浮点数 = 符号位 + 指数位 + 尾数位
- 尾数部分可能丢失,造成精度损失(小数都是近似值)
- 浮点数默认是double,声明float要带f或F
- float f = 11.1; // 编译报错,double转换到float可能会有损失
- 通常情况下,应该使用double,因为比float更精确
- 浮点数结算的结果不要相等比较
- 字符类型
- char 表示单个字符, 用单引号
- char 本质上是一个整数,因此字符类型可以直接存放一个数字
- chart c = 97;
- 输出时是unicode码对应的字符
- char 类型可以进行运算
- 允许使用转义字符 \ 将其后的字符转变为特殊字符型常量 ‘\n’
- public static final char MIN_VALUE = ‘\u0000’;
- public static final char MAX_VALUE = ‘\uFFFF’;
- Java中的char是Unicode编码。Unicode编码占两个字节,就是16位,足够存储一个汉字。
- 字符编码
- ASCII : 标准128个
- ISO-8859-1:扩展ASCII 256
- GB2312:简体中文
- GBK:简体中文
- BIG5: 繁体中文 台湾 香港
- Unicode编码:65536个 全球字符
- UTF-32:每个字符4个字节表示
- UTF-16:每个字符2个字节表示
- UTF-8:是一种变长的存储方式,省存储空间。字母1个字节,汉字是3个字节节。
存储单位换算
- 1byte = 8bit
- 1KB = 1024B(B即byte)
- 1MB = 1024KB
1GB = 1024MB
@Testpublic void test_2() {System.out.println(Byte.MIN_VALUE); //-128System.out.println(Byte.MAX_VALUE); // 127System.out.println(Short.MIN_VALUE); //-32768System.out.println(Short.MAX_VALUE); // 32767System.out.println(Integer.MIN_VALUE); //-2147483648System.out.println(Integer.MAX_VALUE); //2147483647System.out.println(Long.MIN_VALUE); //-9223372036854775808System.out.println(Long.MAX_VALUE); //9223372036854775807}
@Testpublic void test_2() {int n = 11; // 默认就是int类型byte b = 11; //只要赋值给byte的值没有超过其取值范围,就会按照byte类型处理// byte b1 = 128; //编译报错,128超过了byte的取值范围short s = 11; //只要赋值给short的值没有超过其取值范围,就会按照short类型处理long l = 11; // 自动数据类型转换long l1 = 11L; //加L表示是一个long类型的数字}
@Testpublic void test_2() {int n = 11; // 默认是10进制int n1 = 0b101; //前缀 0b 或者 0B 表示二进制int n2 = 017; // 前缀 0 表示八进制int n3 = 0x11; // 前缀 0x 或 0X 表示十六进制int n4 = 0b1111111111_10000000_11100; // 可以用下划线,增强可读性}
@Testpublic void test_2() {double d = 11.1; //默认就是doubledouble d1 = 11.1d;// float f = 11.1; // 编译报错,double转换到float可能会有损失float f = 11.1f;double d2 = 2.0E3; // 浮点数的科学计数法表示System.out.println(d2); // 2000.0 E3表示 10的3次方// 不要在数量级相差很大的浮点数之间进行运算double d3 = 5.25E20;System.out.println(d3 + 1); // 5.25E20 1被丢掉//浮点数不要比较(注意:是参与计算就不能比较,如果是声明的两个常量浮点数是相等的)double d4 = 0.1;double d5 = 0.2;double d6 = d4 + d5;System.out.println(d6); // 0.30000000000000004System.out.println(d6 == 0.3); // false// 精确计算BigDecimal num1 = new BigDecimal("0.1");BigDecimal num2 = new BigDecimal("0.2");System.out.println(num1.add(num2)); //0.3}
@Testpublic void test_2() {char c = '中';System.out.println(c); //中System.out.println((int)c); // 20013//char是一个字符,一个字符有一个编号,因此char可以直接参与运算System.out.println(c + 100); // 20113char cc = 65535;// char cc1 = 65536; //编译报错,超过了char的两个字节能表示的最大数}//https://tool.chinaz.com/tools/unicode.aspx
基本数据类型的 自动类型转换
byte->short->int->long->float->double
char->int->long->float->double
char没有负数,因此byte和short没法包含在其取值范围内。
有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算
- float f = 10 + 1.1; //编译报错
- float f = 10 + 1.1F; // 正确
- 当我们把精度(容量)大的数据类型赋值给精度(容量)小的数据类型时,就会报错,反之就会进行自动类型转换
- byte b = 12; // 正确 当把具体数赋值给byte时,先判断该数是否在byte范围内,如果是就可以
- short s = 12; // 正确
- char c = 12; //正确
- int i = 1; byte b = i; //编译报错
- (byte、short)和char之间不会相互转换,这是规定
- byte b = 12; char c1 = b; //编译报错
- byte、short、char他们三者可以计算,在计算时首先转换为int类型
- byte b = 12; short s = 12; char c = 12;
byte b2 = b + s + c; //编译报错
int i = b + s + c; //正确 - byte b2 = 1; byte b3 = 2;__ _byte b5 = b2 +b3; //编译报错 ,都是byte也会转为int
- byte b = 12; short s = 12; char c = 12;
- boolean不能参与转换
- 自动提升原则:表达式结果的类型自动提升为操作数中最大的类型
基本数据类型的强制类型转换
- 强转符号只针对与最近的操作数有效,往往会使用小括号提升优先级
- char类型可以保存int的常量值,但不能保存int的变量值,需要强转
- byte 和 short ,char类型进行运算时,当做int类型处理
- int i = (int)1.9;
System.out.println(i); // 1 精度丢失 - int n = 263;
byte b = (byte) n;
System.out.println(b); // 7 数据溢出 char n = 263;
byte b = (byte) n; // char 可以和byte强转
System.out.println(b); // 7 数据损失@Testpublic void test_9() {byte b2 = 7;int i = b2;int n = 263;byte b = (byte) n;System.out.println(b); // 7 强制类型导致 数据损失int n2 = 12;byte b1 = (byte)n2;System.out.println(b1); //12 如果int在btye范围内不会有数据损失}

short s = 1; s = s+1; 和 s += 1的区别
public static void main(String[] args) {short s1 = 1;// s1 = s1 + 1; // 编译报错,自定提升为intshort s2 = 4;//s2 = s2 + s1; // 编译报错,byte 和 short ,char类型进行运算时,当做int类型处理byte b = 127;b += 1; //正确,隐式的强制类型转换, byteSystem.out.println(b); // -128}
