计算机如何存储数据
计算机只能理解二进制,在计算机中所有的内容都必须转变为二进制。包括:数字、字符、图片、音频、视频等。
进制
进制分类
1.十进制:0-9 逢十进一
2.二进制:0-1 逢二进一 十进制的256 =二进制的 100000000,为了缩短二进制表示,又要贴近二进制,引入八进制和十六进制
3.八进制:0-7 逢八进一 每三位二进制就是一位八进制的值
4.十六进制:0-9 + a-f 逢十六进一 每四位二进制就是一位十六进制的值
十进制转二进制:除以2倒取余数
二进制转十进制:从右向左一次为2的0次方、2的1次方、2的2次方、2的3次方......
代码表示:
1.十进制:正常表示 System.out.println(10);
2.二进制:0b或0B开头 System.out.println(0b10);
3.八进制:0开头 System.out.println(010);
4.十六进制:0x或0X开头 System.out.println(0x10);
计算机存储单位
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
计算机如何存储数据
1、补码与符号位
计算机数据的存储使用二进制补码形式存储,并且最高位是符号位,1是负数,0是正数。
规定:正数的补码与反码、原码一样,称为三码合一;
负数的补码与反码、原码不一样:
负数的原码:把十进制转为二进制,然后最高位设置为1
负数的反码:在原码的基础上,最高位不变,其余位取反(0变1,1变0)
负数的补码:反码+1
字符存储
Java中使用字符集:Unicode编码集
世界上第一张编码表ASCII Unicode 万国码跨语言跨平台 a:65 A:97
字符常量的表示: ' ' : 单引号中写一个字符 ;转义字符:\n换行\r回车\t制表符 \\:\ \b删除键 \" : " \' : '
基本数据类型转换(Conversion)
基本数据类型转换有两种转换方式:自动类型转换和强制类型转换。
自动转换: 将 取值范围小的类型 自动提升为 取值范围大的类型 。
基本数据类型的转换规(虽然long8字节floa4字节但是flaot的表述范围大于long)
(1)把存储范围小的值赋值给了存储范围大的变量时。
(2)存储范围小的数据类型与存储范围大的数据类型一起混合运算时按照其中最大类型运算。
(3)byte,short,char 进行算术运算时按照 int 类型处理
(4)boolean类型不参与
强制类型转换(显示类型转换)将 取值范围大的类型 自动提升为 取值范围小的类型 。
自动转换是Java自动执行的,而强制转换需要我们自己手动执行。
强制类型转换的转换格式: 数据类型 变量名 = (数据类型) 被强转数据值;
(1)当把存储范围大的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围小的变量时, 需要强制类型转换,提示:有风险,可能会损失精度或溢出
(2)boolean类型不参与
(3)当某个值想要提升数据类型时,也可以使用强制类型转换
(4)小数类型转换为整数类型时会自动舍弃小数部分
(5)超出数据存储范围的强转会溢出
特殊的数据类型转换
(1)任意数据类型的数据与String类型进行“+”运算时,结果一定是String类型
(2)String类型不能通过强制类型()转换,转为其他的类型 转换需要调用 Integer.parseInt("string")
练习
1、练习题:判断如下代码是否编译通过,如果能,结果是多少?
short s1 = 120;
short s2 = 8;
short s3 = s1 + s2;
// shart运算会转换为int ,会报错
2、练习题:判断如下代码是否编译通过,如果能,结果是多少?
short s1 = 120;
short s2 = 8;
byte s3 = (byte)(s1 + s2);
//超过byte范围 最大127
3、练习题:判断如下代码是否编译通过,如果能,结果是多少?
char c1 = '0';
char c2 = '1';
char c3 = c1 + c2;
//char 运算会转 int
4、练习题:判断如下代码是否编译通过,如果能,结果是多少?
char c1 = '0';
char c2 = '1';
System.out.println(c1 + c2);
//输出为编码相加的结果
5、练习题:判断如下代码是否编译通过,如果能,结果是多少?
int i = 4;
long j = 120; //因为右边120默认是int类型,int的值赋值给long类型是可以的,会自动类型转换,但
是要求这个int值不能超过int的存储范围,如果超过int的存储范围必须加L.
double d = 34;
float f = 1.2;//因为右边1.2默认是double类型,double的值是不能直接赋值给float的,要么加F要
么使用强制类型转换。
System.out.println(i + j + d + f);//最后是double
6、练习题:判断如下代码是否编译通过,如果能,结果是多少?
int i = 1;
int j = 2;
double d = i/j;//先按照int类型除法结果会抹除小数部分
System.out.println(d);
//转换为double再运算double d =(double)i/j