一、存储单位
最小单位:比特位,bit,1位比特位要么是0,要么是1
最基本的单位:字节,byte,1个字节=8位
1个字节:1B(B=byte)
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
1PB = 1024TB
二、java的8种基本数据类型
boolean老师说有4个字节,目前不清楚。
三、符号位
用0表示正数、1表示负数。
二进制的最高位/最左边的位是符号位
符号位是针对byte,short,int,long,float,double这些类型来说的。
四、原码、反码、补码
00000100 => 4 10000100 => -4 4 + (-4) 00000100 + 10000100 ---------- 10001000 => -8 ? 不对
因为我们不仅仅要表示数字,还得考虑正、负数的计算问题,所以需要设计新的规则,便于存储和计算,这个时候就提出了原码、反码、补码。
计算机的底层存储和计算都是基于补码的。规定:
正数:原码、反码、补码都一样,三码合一
负数:
原码:最高位是1,其余位是数据位,这些数据位与其绝对值的二进制序列是一样的
反码:最高位不变,其余位在原码的基础上取反(0变1,1变0)
补码:在反码的基础上 + 1
正数的25:+25 原码:00011001 反码:00011001 补码:00011001 负数的25:-25 原码:10011001 反码:11100110 补码:11100111
五、基本数据类型的转换
public class Test01{ public static void main(String[] args){ // 自动转型/向上转型 取值范围小->取值范围大 byte a = 1; short b = a; int c = b; long d = c; float e = d; double f = e; System.out.println(f); 结果为123 byte g = 2; double h = g; System.out.println(h); //强转 取值范围大->取值范围小 double i = 123.123; float j = (float)i; long k = (long)j; int l = (int)k; short m = (short)l; byte n = (byte)m; System.out.println(n); //特殊点1 //向下转型从高位开始舍弃 byte b1 = 1;// 1会被系统默认为int类型,但1在byte的取值范围内,直接赋值 //byte b2=128 128也会被系统默认为int类型但超过byte取值范围,报错 //128 - int:0000,0000,0000,0000,0000,0000,1000,0000 int类型4个字节32位 // (byte):1000,0000 byte类型8位保留后八位 byte b2 = (byte)128; System.out.println(b1);//1d System.out.println(b2);//-128 10000000值为-128 //特殊点2 //int i = 12345678901;//12345678901为int类型的数字字面量,但是超过了int类型的取值范围,所以报错 //特殊点3: //long l1 = 12345678901;//12345678901为int类型的数字字面量,但是超过了int类型的取值范围,所以报错 long l2 = 12345678901L;//12345678901L为long类型的数字字面量,该数字没有超过long类型的取值范围,所以会不会报错 //特殊点4: float f1 = 1;//int -> float 自动转型 //float f2 = 1.0;//double -> float(会报错,大转小) //解决方案1 //float f2 = (float)1.0;//1.0为double类型(64位),强转为float类型(32位) //解决方案2 float f2 = 1.0f;//直接将1.0认为是float类型(32),效率更高 System.out.println(f1); System.out.println(f2); //特殊点5 System.out.println((int)(char)(byte)-1);//65535 //从右往左运行 //-1默认int 1111,1111,1111,1111,1111,1111,1111,1111 //int转为byte 1111,1111 从高位开始舍弃保留后8位 //byte转为char 1111,1111,1111,1111 8位变为16位向上转型,使用符号位补,符号位为1所以补8个1 //char转为int 0000,0000,0000,0000,1111,1111,1111,1111 16位转为32位正常应该使用符号位1补,但是char类型的取值范围没有负数,所以向上补位使用0补位 } }