2.8计算机如何储存数据
2.8.1进制(了解)
略
2.8.2计算机存储单位
字节(Byte):一字节等于八位。
位(bit):最小单位。
8 bit = 1 Byte
1024 Byte = 1KB
2.8.3 java的基本数据类型的存储范围
1.整形系列
(1)byte:字节类型
占内存:1个字节
存储范围:-128~127
(2)short:短整型类型
占内存:2个字节
存储范围:-32768~32767
(3)int:整型
占内存:4个字节
存储范围:-2的31次方 ~ 2的31次方-1
(4)long:整型
占内存:8个字节
存储范围:-2的63次方 ~ 2的63次方-1
注意:如果要表示某个超过int范围的常量整数它是long类型,那么需要在数字后面加L。
2、浮点型系列(小数)
(1)float:单精度浮点型
占内存:4个字节
精度:科学记数法的小数点后6~7位
注意:如果要表示某个常量小数是float类型,那么需要在数字后面加F或f,否则就是double类型
(2)double:双精度浮点型
占内存:8个字节
精度:科学记数法的小数点后15~16位
float f = 12.0F;//右边如果赋值小数常量值,那么必须加F或f
3、单字符类型:char
占内存:2个字节
4、布尔类型
boolean:只能存储true或false
虽然计算机底层使用0和1表示false和true,但是在代码中不能给boolean类型的变量赋值0和1,只能赋值false和true
2.8.4计算机如何存储数据
1.补码与符号位
计算机数据的存储使用二进制补码形式存储,并且最高位是符号位,1是负数,0是正数。
规定:正数的补码与反码、原码一样,称为三码合一;
负数的补码与反码、原码不一样:
负数的原码:把十进制转为二进制,然后最高位设置为1
负数的反码:在原码的基础上,最高位不变,其余位取反(0变1,1变0)
负数的补码:反码+1
2.如何存储字符
字符 ------数值
0 ------> 48
A------> 65
a------> 97
将所有的英文字母,数字,符号都和十进制进行了对应,因此产生了世界上第一张编码表ASCII
2.9基本数据类型转换
1.自动类型转换(隐式类型转换)
自动转换:将取值范围小的类型自动提升为取值范围大的类型 。
(1)当把存储范围小的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围大的变量时,
int i = 'A';//char自动升级为int
double d = 10;//int自动升级为double
?
byte b = 127; //右边的整数常量值必须在-128~127范围内
//byte bigB = 130;//错误,右边的整数常量值超过byte范围
long num = 1234567; //右边的整数常量值如果在int范围呢,编译和运行都可以通过,这里涉及到数据类型转换
long bigNum = 12345678912L;//右边的整数常量值如果超过int范围,必须加L,否则编译不通过
(2)当存储范围小的数据类型与存储范围大的数据类型一起混合运算时,会按照其中最大的类型运算
int i = 1;
byte b = 1;
double d = 1.0;
?
double sum = i + b + d;//混合运算,升级为double
(3)当byte,short,char数据类型进行算术运算时,按照int类型处理
byte b1 = 1;
byte b2 = 2;
byte b3 = b1 + b2;//编译报错,b1 + b2自动升级为int
?
char c1 = '0';
char c2 = 'A';
System.out.println(c1 + c2);//113
(4)boolean类型不参与
2.强制类型转换(显示类型转换)
将1.5 赋值到int 类型变量会发生什么?产生编译失败,肯定无法赋值。
int i = 3.14; // 错误
想要赋值成功,只有通过强制类型转换,将double 类型强制转换成int 类型才能赋值。
强制类型转换:将取值范围大的类型强制转换成取值范围小的类型。
比较而言,自动转换是Java自动执行的,而强制转换需要我们自己手动执行。
转换格式:
数据类型 变量名 = (数据类型)被强转数据值;
(1)当把存储范围大的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围小的变量时,需要强制类型转换,提示:有风险,可能会损失精度或溢出
int i = (int)3.14;//强制类型转换,损失精度
?
double d = 1.2;
int num = (int)d;//损失精度
?
int i = 200;
byte b = (byte)i;//溢出
(2)boolean类型不参与
(3)当某个值想要提升数据类型时,也可以使用强制类型转换
int i = 1;
int j = 2;
double shang = (double)i/j;
提示:这个情况的强制类型转换是没有风险的。
3、特殊的数据类型转换
1、任意数据类型的数据与String类型进行“+”运算时,结果一定是String类型
System.out.println("" + 1 + 2);//12
2、但是String类型不能通过强制类型()转换,转为其他的类型
String str = "123";
int num = (int)str;//错误的
int num = Integer.parseInt(str);//后面才能讲到,借助包装类的方法才能转
2.10运算符
2.10.1
分类———————运算符
算术运算符 +、-、**(应该是一个)、/、%、++、- -
赋值运算符 =、+=、-=、*=、/=、%= 等
关系运算符 >、>=、<、<=、==、!=
逻辑运算符 &、|、^、!、&&、||
条件运算符 (条件表达式)?结果1:结果2;
位运算符(了解) &、|、~、^、<<、>>、>>>
++在前,先自加,后使用;
++在后,先使用,后自加。
public static void main(String[] args){
int i = 1;int j = i++;int k = i++ * ++j + ++i * j++;System.out.println("i = " + i);System.out.println("j = " + j);System.out.println("k = " + k);}//i = 4;//j = 3;//k = 12;
2.10.2赋值运算符
赋值运算符————符号解释
= : 将符号右边的值,赋值给左边的变量
+= : 将符号左边的值和右边的值进行相加操作,最后将结果赋值给左边的变量
-= : 将符号左边的值和右边的值进行相减操作,最后将结果赋值给左边的变量
*= : 将符号左边的值和右边的值进行相乘操作,最后将结果赋值给左边的变量
/= : 将符号左边的值和右边的值进行相除操作,最后将结果赋值给左边的变量
%= : 将符号左边的值和右边的值进行取余操作,最后将结果赋值给左边的变量
例:
public class OperatorDemo04 {
public static void main(String[] args) {
int a = 3;int b = 4;b += a;// 相当于 b = b + a ; System.out.println(a); // 3System.out.println(b); // 7 short s = 3;// s = s + 4; 代码编译报错,因为将int类型的结果赋值给short类型的变量s时,可能损失精度s += 4; // 代码没有报错//因为在得到int类型的结果后,JVM自动完成一步强制类型转换,将int类型强转成shortSystem.out.println(s);int j = 1;j += ++j * j++;//相当于 j = j + (++j * j++);System.out.println(j);//5}
}
扩展赋值运算符在将最后的结果赋值给左边的变量前,都做了一步强制类型转换。
2.10.3 关系运算符/比较运算符
略
2.10.4 逻辑运算符
1.
2.&&和&区别,||和|区别
&&和&区别:
&&和&结果一样,&&有短路效果,左边为false,右边不执行;&左边无论是什么,右边都会执行。 ||和|区别:
||和|结果一样,||有短路效果,左边为true,右边不执行;|左边无论是什么,右边都会执行。
2.10.5条件运算符
条件运算符格式:
条件表达式?结果1:结果2
条件运算符计算方式:
条件判断的结果是true,条件运算符整体结果为结果1,赋值给变量。
判断条件的结果是false,条件运算符整体结果为结果2,赋值给变量。
public static void main(String[] args) {
int i = (1==2 ? 100 : 200);System.out.println(i);//200int j = (3<=4 ? 500 : 600);System.out.println(j);//500
}
2.10.6位运算符
左移:<<
运算规则:左移几位就相当于乘以2的几次方
右移:>>
运算规则:右移几位就相当于除以2的几次方
无符号右移:>>>
运算规则:往右移动后,左边空出来的位直接补0,不看符号位
注意:当左移的位数n超过该数据类型的总位数时,相当于左移(n-总位数)
byte,short,char在计算时按照int类型处理
如何区分&,|,^是逻辑运算符还是位运算符?
如果操作数是boolean类型,就是逻辑运算符,如果操作数是整数,那么就位运算符。
2.10.7运算符优先级
提示说明:
(1)表达式不要太复杂
(2)先算的使用()
大体的排序:算术->位–>比较–>逻辑–>三元–>赋值