3.4.1 整型
byte:8 位,-128~127
short:16 位,-32768~32767
int:32 位,-2147483648~2147483647
long:64 位。-2^63~2^63-1
- 所有直接给出的整数值默认 int 类型。
- 较小整数[byte/short 表数范围内]赋值给byte和short变量,系统自动当成对应类型处理
巨大整数[超过int范围]赋值给long,系统不能自动当成long处理,需要加上L后缀使系统将其当成Long类型处理
所有数字在计算机底层以二进制形式存在
- 计算机以补码形式保存所有整数。补码是原码取反+1,程序中给出的二进制数均为补码形式。
- 二进制整数最高位为符号位
- 正数:符号位为0->补码和原码相同->可直接成换算十进制
负数:符号位为1->补码[减1]->反码[按位取反]->原码->可直接换算十进制
package jwz; /** * 整型数据类型测试 */ public class IntTest{ public static void main(String[] args) { // 巨大整数和较小整数示例 // 较小整数[byte/short范围允许]赋值给byte和short,系统自动当成对应类型处理 byte byteValue=56; System.out.println("byte类型数:"+byteValue);// 输出56 // 大整数[超过int范围]赋值给long,系统不能自动当成long处理,需要加上L后缀 // long bigValue=999999999999;// 编译出错 long bigValue2=999999999999L;// 编译通过 // 二进制/八进制/十六进制示例: // 二进制整数:0b或0B开头 short binValue=0B01101001; System.out.println("二进制数:"+binValue); // 八进制整数:0开头 int octalValue=013; System.out.println("八进制数:"+octalValue); // 十六进制整数:0x或0X开头[10-15用a~f表示,不区分大小写] int hexValue=0X1f; System.out.println("十六进制数:"+hexValue); // 二进制原码/补码/正数/负数/溢出示例: // 整数值默认int类型,32位,正数 // 强制转换后:byte类型,1字节,第8位成为符号位,负数,该现象称为溢出 byte binValue1=(byte)0B11010100; // 2字节,第8位不是符号位,正数 short binValue2=0B11010100; System.out.println("二进制数:"+binValue1+"\t"+binValue2); // 4字节,32位为符号位,负数 int binValue3=0B10000000000000000000000000000011; // 添加"L"后缀,当成long类型处理,8字节,32位不为符号位,正数 long binValue4=0B10000000000000000000000000000011L; System.out.println("二进制数:"+binValue3+"\t"+binValue4); } }
3.4.2 字符型
- 定义:表示单个字符,必须用单引号括起来
'a'
- 字符集:所有字符的编号组成的总和
- ASCII字符集[8位,支持256个字符编号]
- Unicode字符集[16位,支持65536个字符编号],java支持
字符型值表示形式:
- 直接通过单个字符指定字符型值:’A’,’9’
- 通过转义字符表示特殊字符型值:’\n’ ‘\t’ ‘\b’ ‘\r’ ‘\’ ‘\” ‘\”’
直接使用Unicode值表示:’\ uXXXX’,xxxx代表十六进制整数
计算机保存字符时,实际上是保存该字符在字符集中对应的编号,因此char类型的值可以直接作为16位无符号整数使用,2字节,表数范围0~65535
/** * 字符型测试 */ public class CharTest{ public static void main(String[] args) { char aChar='A';// 单个字符 char enterChar='\r';// 转义字符 char enterChar1='\n';// 转义字符 char ch='\u9999';// Unicode编码值 char chi='香';// 单个中文字符 int chiValue=chi;// 当作无符号整数使用 char c=97;// 使用无符号整数赋值,系统会自动将int整数当成char类型处理 char hexValue=0x9999;// 16进制的9999 == '香' 的Unicode编码值,输出 '香' System.out.println(aChar+"\t"+enterChar+"\t"+enterChar1+"\t"+ch+"\t"+chi+"\t"+chiValue+"\t"+c+"\t"+hexValue); } }
3.4.3 浮点型
- Java 的浮点类型有固定的表数范围和字段长度,与机器无关。
- Java 采用二进制数据的科学计数法来表示浮点数,因此不可能精确。
- 精确度:BigDecimal>double>float
- float:单精度浮点数,4字节,32位,1位符号位,8位指数位,23位尾数
- double:双精度浮点数,8字节,64位,1位符号位,11位指数位,52位尾数
- 浮点型数据表示方法:
- 十进制:5.12,52.0,.512 必需包含小数点,否则被当成 int
- 科学计数法:5.12e2–>5.12*10^2 [只有浮点数可以使用科学计数法形式表示]
- Java 浮点数默认 double 类型,需要加f后缀,才会被当成 float 类型处理[类比long型整数]
- ±无穷大和非数:用以表示溢出和出错。
- ±浮点数/0 得到±无穷大:用Double或float类的POSITIVE_INFINITY/NEGATIVE_INFINITY表示
- 0.0/0.0 或 对一个负数开方 或 0、0.0对任何非0数求余 得到非数 NAN
- 只有浮点数才可以/0[自动转换成/0.0,否则/0 异常]
- 所有无穷大数值都是相等的,而非数不与任何数值相等,甚至其本身
/**
* 浮点型数据
*/
public class FloatTest{
public static void main(String[] args) {
// 默认为double类型
double a=5.6;
System.out.println("double类型:"+a);
// 编译出错,Java默认浮点类型为double,表示float需要加f后缀或强制类型转换
// float a=5.6;
float ff=(float)5.6;//默认double,强制转换成float
float af=5.6f;// 添加后缀表示其为float类型
System.out.println("float类型:"+af+"\t");
// ±无穷大示例:
double c=Double.NEGATIVE_INFINITY;//double类型负无穷大
float d=Float.NEGATIVE_INFINITY;//float类型负无穷大
a=0.0;
System.out.println("负无穷大:"+(-8/a));//负数除以0.0得到负无穷大
System.out.println("正无穷大:"+(8/a));//正数除以0.0得到正无穷大
System.out.println("负无穷大比较:"+(-6.0/0 == -555.0/0)+"\t"+(c==d));//负无穷大相等
double c1=Double.POSITIVE_INFINITY;//double类型正无穷大
float d1=Float.POSITIVE_INFINITY;//float类型正无穷大
System.out.println("正无穷大比较:"+(6.0/0==c1)+"\t"+(c1==d1));//正无穷大相等
// 非数NaN示例:
System.out.println("非数:"+(a/a));//0.0除以0.0或对一个负数开方得到非数
System.out.println("非数比较"+(a/a==Float.NaN));//非数不相等
// by /zero 异常
// System.out.println(8/0);//算术异常
}
}
3.4.4 数值中使用下划线分隔
/**
* 数值中可以自由的使用下划线分隔
*/
public class UnderLineTest{
public static void main(String[] args) {
int binValue=0B1000_0000_0000_0000_0000_0000_0000_0011;
double pi=3.14_15_92_65_36;
System.out.println(binValue);
System.out.println(pi);
double height=8_8_4_8.23;
System.out.println(height);
int s=8_8;
System.out.println(s);
}
}
3.4.5 布尔型
- 1字节,8位,true/false ,不能用0/1表示
- boolean类型的值实际上只需要1位即可保存,但大部分计算机分配内存的最小单位是字节,8位
- 其他基本数据类型不能转换成boolean类型
- boolean类型和其他字符串连接时自动转换成字符串
- boolean类型的值或变量主要用于流程控制:if/while/do while/for/? :
/**
* 布尔型测试
*/
public class BooleanTest{
public static void main(String[] args) {
boolean b1=true;
boolean b2=false;
//boolean类型和其他字符串连接时自动转换成字符串
String str=b1+"_str";
System.out.println(b1+"\t"+b2+"\t"+str+"\t"+(b1==true)+"\t"+(b1==b2));
}
}