布尔类型也叫boolean类型,只有2种取值:false 、true.没有null(空)。不可以用0或者非0的整数替代false , true,这点与C语言不同。
boolean 类型占1个字节。
boolean 适用于逻辑运算,一般用于程序流程控制:
if 条件控制语句;
while 循环控制语句;
do-while 循环控制语句;
for 循环控制语句
public class Boolean01{
// 编写一个main方法
public static void main(String[]args){
//演示判断成绩是否通过的案例
//定义一个布尔变量isPass ,并赋值true
boolean isPass = true;
if(isPass == true) {
System.out.println("考试通过,恭喜");
} else {
System.out.println("考试没有通过,下次努力");
}
}
}
基本数据类型转换
自动类转换:
当java 程序在进行赋值或者运算时,精度低的类型自动转换为精度高的数据类型,精度高的不能像精度低的转换,这个就是自动类型转换。
由低字节向高字节的转换
byte->short-> char –>int->long->float->double
char-->int-->long-->float-->double
public class AutoConvert {
//编写一个main 方法
public static void main(String[]args) {
//演示自动转换
int num = 'a';
double d1 = 80;
System.out.println(d1); // 80.0
System.out.println(num); // 97
}
}
自动类型转换注意和细节:
1、有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后进行计算。
2、当我们把精度(容量)大的数据类型赋值给精度(容量)小的数据类型时,就会报错,反之就会进行自动类型转换。
3、byte、short、char不可以相互转换、但是可以运算 运算时会转换成int类型
// 自动类型转换细节
public class AutoConvertDetail {
//编写一个main方法
public static void main(String[]args) {
// 有多种类型的数据混合运算时,
// 细节1:系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算
int n1 = 10;
//float d1 = n1 + 1.1; // 报错。n1+1.1=>输出结果是double,double是精度最高的数据
//double d1 = n1 + 2.2; //n1 + 2.2 结果类型是double
float d1 = n1 + 2.2F; // n1 + 2.2 结果类型是float
//细节2:当我们把精度高的数据类型赋值给精度小的数据类型时,就会报错;
//int n2 = 1.1; //错误 double(高)向int(底精度)转换
//细节3:(byte,short)和char 之间不会相互自动转换
//当爸具体数赋值给byte,首先判断该数收否在byte 范围内,如果是就可以。
byte b1 = 10; // 对,范围在-128-127
//int n2 = 1; // n2 是int
//byte b2 = n2;//错误,原因:n2 是int 类型,不能向低精度数据自动转换
// char c1 = b1; // 错误,原因; byte 不能自动转换成char
// 细节4:byte ,short ,char 他们三者可以计算,在计算时首先转换为int 类型
byte b2 = 1;
short s1 = 1;
//short s2 = b2 + s1; //错,b2 +s1=> int
int s2 = b2 + s1; // 对
byte b3 = 2;
// byte b4 = b2 + b3 //报错:b2 + b3=>int
//boolean 不参与转换
boolean pass = true;
//int num100 = pass; //boolean 不参与类型的自动转换
//自动提升原则:表达式结果的类型自动提升位操作数中最大的类型
byte b4 = 1;
short s3 = 100;
int num200 = 1;
float num300 = 1.1F;
// int num500 = b4 + s3 + num200 + num300;// 错误,float 无法转换为int.
float num500 = b4 + s3 + num200 + num300; // 对的,这里面操作数最大的是float
double num800 = b4 + s3 + num200 + num300; // 这里面操作数最大的是float ,所以可以有float转换为double .
System.out.println((int)num800); //输出结果103
System.out.println(num800); //输出结果103.0999984741211
}
}
强制类型转换:
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符(),但是可能造成精度降低或溢出。
语法格式:目标类型 变量 =(目标类型)源类型变量或常量
整数存原码,负数存补码
public class ForceConvert{
// 编写一个main 方法
public static void main(String[]args) {
//演示强制类型转换
int n1 = (int)1.9;
System.out.println("n1=" + n1);// 结果为1
int n2 = 275;
byte b1 = (byte)n2;
System.out.println("b1=" + b1);// b1=-19
int n3 = 1500;
byte b2 = (byte)n3;
System.out.println("b2=" + b2);// b2 = -36
}
}
int转byte ,数据底层原理
int 类型变量n1,占4个字节,byte 类型变量b1占1个字节,当把int类型转换为byte 类型时,前面高3位字节的数据丢失,数值发生改变。
int(275) 00000000 00000000 00000001 00010011
byte(19) 00010011 正数(原码、反码、补码一致)
int(1500)00000000 00000000 00000101 11011100
bye(-36) 11011100
11011100,首位的第一位是1表示负号。
在正整数中:源码 =反码 =补码
在负整数中:如果是负数,将源码的符号位不变,其余各位取反,得到反码
如果是负数,将反码+1,得到补码
1500的原码:00000000 00000000 00000101 11011100
1500的反码:00000000 00000000 00000101 11011100
1500的补码:00000000 00000000 00000101 11011100
强转位byte 后:11011100 ,现在是负数了
补码:11011100
反码:11011011
原码:10100100
8421码:128 64 32 16 8 4 2 1
8421码: 128 64 32 16 8 4 2 1
10100100,从右到左对应8421码:-(4+32)=-36
0 |
1 |
0 |
2 |
1 |
4 |
0 |
8 |
0 |
16 |
1 |
32 |
0 |
64 |
1 |
负号 |
强制类转换细节:
1、强转符号只针对最近的操作数有效,往往会使小括号提升优先级
2、char类型可以保存int 的常量,但是不能保存int 的变量值,需要强转。
public class ForceConvertDetail {
//编写一个main 方法
public static void main(String[]args) {
// 演示强制类型转换
//int x = (int)10*3.5+6*1.5 // 这里(int)只对10有提升作用,整体X的数据类型还是 double.
int x = (int)(10*3.5+6*1.5); // (int)44.0->44
System.out.println(x); //输出44
char c1 = 100;
int m = 100;
//char c2 = m; // 报错
char c3 =(char)m;
System.out.println(c3);// 100对应的字符:d
}
}