计算机世界中只有二进制。那么在计算机中存储和运算的所有数据都要转为二进制。包括数字、字符、图片、声音、视频等。
进制
进制也就是进位计数制,是人为定义的带进位的计数方法 。不同的进制可以按照一定的规则进行转换。
进制的分类
在Java代码中如何表示四种进制的值
public class Demo1 {/*十进制:Java中,数值默认都是10进制,不需要加任何修饰。二进制:数值前面以0b开头,b大小写都可以。八进制:数值前面以0开头。十六进制:数值前面以0x开头,x大小写都可以。注意: 书写的时候, 虽然加入了进制的标识, 但打印在控制台展示的都是十进制数据.*/public static void main(String[] args) {// 十进制:正常表示System.out.println(10);//10//二进制:0b或0B开头System.out.println(0B10);//2//十六进制:0x或0X开头System.out.println(0x10);//16//八进制:0开头 System.out.println(010);//8}
}
计算机如何存储运算数据
计算机中的数据,都是以二进制补码的形式在存储和运算,而补码则是通过反码和原码推算出来的。
Java中如何存储字符
在计算机的内部都是二进制的0、1数据,如何让计算机可以直接识别人类文字的问题呢?就产生出了编码表的概念。编码表 :就是将人类的文字和一个十进制数进行对应起来组成一张表格。常见字符和数值的对应关系如下图所示:
总结:
例如:
public class Demo {public static void main(String[] args) {//字符类型变量char c = 'a';int i = 1;//字符类型和int类型计算System.out.println(c + i);//98}
}
计算机中的存储单位
Java是一种强类型语言,针对每种数据都给出了明确的数据类型 。Java的数据类型分为两大类:
今天我们重点学习的是基本数据类型,关于引用数据类型,后面我们会重点学习。
那为什么会有不同的数据类型呢?
在这里,我们给出每种基本数据类型的内存占用和取值范围,大家了解一下:
整型系列(整数)
/*
注意事项:Java中的默认整数类型是int,给 byte 或者 short赋值时,其值只要不超出其取值范围就可以直接赋值,否则报错声明long类型数值的时候 要在数值的末尾+l/L。 建议使用大写的L*/
public class Demo01DataTypeTest {public static void main(String[] args) {/*(1)byte:字节类型: 占内存:1个字节 存储范围:-128~127*/byte b = 127;// b = 128; 不兼容的类型: 从int转换到byte可能会有损失System.out.println("b = " + b);/*short:短整型类型:占内存:2个字节,存储范围:-32768~32767*/short s = 20;System.out.println("s = " + s);/*int:整型:占内存:4个字节,存储范围:-2的31次方 ~ 2的31次方-1*/int i = 30;System.out.println("i = " + i);/*long:长整型:占内存:8个字节,存储范围:-2的63次方 ~ 2的63次方-1*/long l = 2222222222L; //如果要表示某个超过int范围的常量整数它是long类型,那么需要在数字后面加LSystem.out.println("l = " + l);}
}
浮点型系列(小数)
/*
浮点型:1. 浮点类型 默认的数据类型是 double,2. 声明float类型的数据 要在数值的末尾 + f/F建议大家使用 F3.浮点类型底层采用的是科学计数法表示double d1 = 3.14e2;d1 = 3.14E2;4. 小数底层存储方式与 整数不同,细分为 符号位 指数位 尾数位5. 小数不能精确的表示一个值*/
public class Demo02DataTypeTest {public static void main(String[] args) {/*float:单精度浮点型占内存:4个字节精度:科学记数法的小数点后6~7位*/float f = 3.14F; //如果要表示某个常量小数是float类型,那么需要在数字后面加F或f,否则就是double类型System.out.println("f = " + f); //f = 3.14f = 3.14E10F;System.out.println("f = " + f); //f = 3.13999995E10/*double:双精度浮点型占内存:8个字节精度:科学记数法的小数点后15~16位*/double d = 3.14;System.out.println("d = " + d); //d = 3.14d = 3.14e10;System.out.println("d = " + d); //d = 3.14E10}
}
单字符类型:char
字符常量的几种表示方式
/*
字符类型:占内存:2个字节 ,有且只能存储一个字符*/
public class Demo04DataTypeTest {public static void main(String[] args) {//一个字符char c1 = 'A';System.out.println("c1 = " + c1); //c1 = A//(2)转义字符char c2 = '\t';System.out.println("你好" + c2 + "世界"); //你好 世界//(3)字符的Unicode编码值的十六进制型char c3 = '\u5c1a'; System.out.println("c3 = " + c3); //c3 = 尚//(4)直接给char类型变量赋值十进制的0~65535之间的Unicode编码值char c4 = 97;System.out.println(c4);// a}
}
布尔类型
虽然计算机底层使用0和1表示false和true,但是在代码中不能给boolean类型的变量赋值0和1,只能赋值false和true
/*
boolean占内存:1个字节有且仅有两个值 true / false*/
public class Demo03DataTypeTest {public static void main(String[] args) {boolean flag = true;System.out.println(flag); //trueflag = false;System.out.println(flag); //false}
}
总结:
字面量就是数据/数值,只有“字面量”机制的话,是远远不够的,因为只有字面量内存是无法重复利用的。使用变量之后,内存空间就得到了复用。所谓变量:可变化的量。它的意思是变量中存储的数据不是一成不变的,是可以被改变的, 假设变量 i 中之前存储的数据是 10,我们可以将 10 换成 100,变量就是这个意思。声明变量的实质就是申请内存空间。变量的作用:用来存储数据,代表内存的一块存储区域,这块内存中的值是可以改变的。根据变量名进行使用,可以输出,也可以修改值。变量定义的格式包括三个要素:
变量的声明和赋值
public class Demo01Variable {public static void main(String[] args) {/*变量的定义格式数据类型 变量名称;变量名称 = 数据值;*/byte a;//声明了一个byte类型(1个字节)的变量,给变量名称叫做a//把数字66存储到byte类型的变量a中a = 66;//打印变量a中保存的数据System.out.println(a);// 66//把数字88存储到byte类型的变量a中,原有的数据66将被替换a = 88;//打印变量a中保存的数据System.out.println(a);// 88}
}
还可以在同一行声明多个同一种数据类型的变量,中间使用逗号隔开。但不建议使用这种方式,降低程序的可读性。
public class Demo02Variable {public static void main(String[] args) {/*变量的定义格式数据类型 变量名称1,变量名称2,变量名称3;变量名称1 = 数据值1;变量名称2 = 数据值2;变量名称3 = 数据值3;*///声明了三个int类型(4个字节)的变量,给每个变量分别起名为c,d,eint c, d, e;//给c,d,e 变量分别赋值c = 200;d = 300;e = 500;//打印各种变量中保存的数据System.out.println(c);//200System.out.println(d);//300System.out.println(e);//500}
}
public class Demo03Variable {public static void main(String[] args) {/*变量的定义格式二:数据类型 变量名称 = 数据值;*///声明了一个short类型(2个字节)的变量,变量名称为b,同时给b赋值为100short b = 100;System.out.println(b);// 100}
}
也可以在同一行声明多个同一种数据类型的变量,中间使用逗号隔开。但不建议使用这种方式,降低程序的可读性。
public class Demo04Variable {public static void main(String[] args) {/*变量的定义格式数据类型 变量名称1 = 数据值1,变量名称2 = 数据值2,变量名称3 =数据值3 ;*///声明3个long类型的变量f,g,h,并且同时各自赋值long f = 600L,g = 700L,h = 800L;//打印long类型(8个字节)的变量中保存的内容System.out.println(f); //600System.out.println(g); //700System.out.println(h); //800}
}
变量定义的注意事项:
代码示例
public class Demo04Variable {public static void main(String[] args) {/*1. 变量名不允许重复定义*/int a = 10;// int a = 20; 错误代码,重复定义变量名a = 20;System.out.println(a);/*3. 变量在使用之前一定要进行赋值*/int i;//System.out.println(i);错误/*4. 定义float和long变量的注意事项定义float类型变量的使用: 需要在数值的后面加入F的标识,F可以大写也可以小写.但是, 建议大写定义long类型变量的使用 : 需要在数值的后面加入L的标识,L可以大写也可以小写.但是, 建议大写*/float f = 12.3F;long l = 1000L;System.out.println(f);System.out.println(l);/*5. 变量的作用域范围变量的作用域 : 只在它所在的大括号中有效*/{int x = 20;// 当这个大括号中的代码执行完毕后, 内部所[定义]的变量就会丛内存中消失System.out.println(x);}//System.out.println(x); 错误:变量的作用域 : 只在它所在的大括号中有效}
}
自动类型转换
下列情况就会发生自动类型转换
int i = 'A';//char自动升级为int
double d = 10;//int自动升级为doublebyte b = 127; //右边的整数常量值必须在-128~127范围内
//byte bigB = 130;错误,右边的整数常量值超过byte范围
long num = 1234567; //右边的整数常量值如果在int范围呢,编译和运行都可以通过,这里涉及到数据类型转换
long bigNum = 12345678912L;//右边的整数常量值如果超过int范围,必须加L,否则编译不通过
int i = 1;
byte b = 1;
double d = 1.0;double sum = i + b + d;//混合运算,升级为double
byte b1 = 1;
byte b2 = 2;
byte b3 = b1 + b2;//编译报错,b1 + b2自动升级为intchar c1 = '0';
char c2 = 'A';
System.out.println(c1 + c2);//113
强制类型转换
特点:
下列情况就会发生强制类型转换
当把存储范围大的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围小的变量时,需要强制类型转换,提示:有风险,可能会损失精度或溢出
public class Demo02Convert {public static void main(String[] args) {short s = 1;/*s是short类型,1是int类型,运算时类型不一致,会发生自动类型转换short类型(2个字节)的s会自动转换成int类型最终变成了两个int数据相加,结果是int类型不能直接赋值给左侧的short类型的变量s但是在赋值之前把int类型的结果,强制转换成short类型(砍掉左侧的2个字节的内容),*/s = (short) (s + 1);System.out.println(s);double d = 9.999;int i = (int) d;//精度损失System.out.println(i);//9int a = 8888;byte b = (byte) a;//数据溢出System.out.println(b);//-72}}
当某个值想要提升数据类型时,也可以使用强制类型转换。提示:这个情况的强制类型转换是没有风险的。
int i = 1;
int j = 2;
double shang = (double)i/j;
基本数据类型之间是存在固定的转换规则的,无论是哪个程序, 将这 6 个规则套用进去,问题迎刃而解: