day02
一 标识符的定义及各种标识符的命名规则
包名:
全部小写,每级包名用.连接
如com.longhr.myfile
类或接口:
每个单词大写
Student Teacher StudentName
方法或变量
首单词首字母小写其余单词首字母大写
studentName showScreen
常量:
全部单词大写,如果有多个单词,用_连接
如STUDENT_MAX_AGE
二 注释:
三种注释方法:多行注释/**/ 单行注释// 文档注释 暂时不讲
三 进制
二进制:以0b开头
八进制:以0开头
十进制: 整数默认就是十进制的
十六进制:以0x开头,由0123456789abcdef开头,大小写随意
规则:
以x进制为例,系数就是每一位上的数值本身,基数就是x,权就是从最右边开始,从0开始编号
x进制要转换为十进制,规则是 所有 系数*基数^权 相加
比如二进制 101转换为十进制
1*2^2+0*2^1+1*2^0=4+0+1=5
练习:
得到下面数据的十进制值:
0b10101
这是个二进制,以0b开头,按照权值法计算,十进制为 1*2^4+0*2^3+1*2^2+0*2^1+1*2^0=16+0+4+0+1=21
0123
0开头的是个八进制
1*8^2+2*8^1+3*8^0=64+16+3=83
0x3c
0x开头表明是十六进制
3*16^1+c*16^0=48+12=60
十进制到其他进制的转换:
使用除商取余法,用目标十进制数除以要转为其他进制的进制数,每次将除得之后的余数列出,并用得到的商继续去除
一直除到商为0为止,这个时候将余数按顺序列出即为要转为的其他进制数
练习:
得到以下十进制数的其他进制数
20
二进制数:
20 / 2 = 10..0
10/2=5..0
5/2=2..1
2/2=1..0
1/2=0..1
结果为0b10100
八进制
20/8=2..4
2/8=0..2
结果为024
十六进制
20/16=1..4
1/16=0..1
结果为0x14
任意的x进制到y进制的转换:
答:用十进制做桥梁
x进制->十进制->y进制
练习:
将下面不同进制数之间进行转换
0b1011001->八进制
二进制转八进制
方式1:
64+16+8+1=89
89/8=11..1
11/8=1..3
1/8=0..1
结果为0131
方式2:
之所以提到方式2是因为二进制转八进制有点特殊,可以采用“拆分组合法”进行转换
0b 001 011 001
1 3 1 结果是0131
每三位转换一次八进制
同理也可以转换为十六进制,即每四位转换一次十六进制
有符号数据的表示法
原码、反码、补码
计算机在操作的时候都是“二进制的补码进行计算的”,原码由符号位加数值位组成,正数的反码与原码相同,负数的反码是符号位不变数值位取反
正数的补码与原码一致,负数的补码是原码的取反加1
练习
已知原码求补码和反码,最后一位的B表示这是个二进制
10110100B
第一位为1,表示是个负数,所以其反码为11001011B,补码为反码加1,即11001100B
已知补码,求原码,最后一位的B表示这是个二进制
11101110B
仍然是负数,则反码应该补码减1,11101101B,原码即为1 0010010 B
四、变量
程序执行过程中,其值可以在一定范围内发生改变的量
变量指向了程序中的一个“空间”,这个空间中存储了一个值,并且指定了这个空间中的值得数据类型
定义变量的格式是:
数据类型 变量名= 值
java语言是强类型语言,每个变量必须定义数据类型
注意细节:
1.直接书写的书面形式的整数默认是int类型,所以书面形式的整数书写的时候不能超过int范围
int类型是4个字节,即最大值e为2的32次方-1,当给long类型的变量赋值时务必在右边的数值边上加上L,否则会提示数值超过int的报错
long l = 100000000000000 //会提示错误,因为超过了int的范围
long l = 100000000000000L //正确,加上了L表示右边的值是个长整形
2.单精度浮点数用f或F标志,比如3.1355F,书面形式的浮点数默认使用双精度类型,当给单精度浮点数赋值的时候务必要在右边的浮点数的边上加上F标志,否则会提示有可能损失精度的报错,
因为双精度浮点数是8个字节,而单精度浮点数的字节数是4个字节,直接将双精度赋值给单精度有可能会损失精度。
//下面这样的是错误的
float f = 3.145
//下面是正确的给单精度变量赋值的做法
float f = 3.1345F
3.没有初始化的变量不能直接使用,在使用变量之前务必赋值
4.一行可以定义多个变量但是不建议这样做
//在一行上定义多个变量,只要以分号结尾就表示一条语句的结束,所以多条语句可以写在一行。
int a= 10;int b = 20;int c= 30;
可以同时定义多个相同类型的变量,用英文逗号隔开
5.数据类型之间的默认转换
byte-short-char-int-long-float-double
按照从小到大的顺序进行转换,当2个不同数据类型的变量进行计算的时候,会按照以上顺序先进行转换然后再进行计算,计算的结果也就是转换后的数据类型。
要注意一点的是byte、short char这三种类型的变量混合在一起进行计算的时候,会统一先转换为int类型再进行转换。
//当将大精度数据类型赋值给小精度数据类型的变量的时候,如果大精度的数值的确可以用小精度的变量的表示的话,可以使用强制类型转换将大精度的数值转换为小精度的变量
byte a = 3;
int b = 4;
//强制类型转换
byte c = (byte)(a+b);
System.out.println(c);
但是注意不要随意的使用强制类型转换,因为它隐含了精度损失的问题。
7.注意:如果是char byte short三种的“变量”进行运算的话,比如 byte a = 1,b=3;a+b;那么会统一转换为int类型进行计算,结果为int,如果赋值给byte类型的变量会提示精度丢失的报错
但是如果是用3个整数常量直接进行计算然后再赋值给byte的话,编译器会先计算好常量计算后的值然后再判断是否在byte类型范围内再决定是否可以赋值给byte类型的变量。
比如:
//可以正常编译,编译器直接将运算结果转换为7,赋值给byte类型的变量.
byte a = 3+4;
//编译报错,结果超过了byte类型的范围,赋值给byte变量会报错
byte a = 120+20;
注意,如下例子是很容易犯的错误!
//会提示报错,
byte b = 130;
//可以使用强制类型转换,不让其报错,但是结果要注意了!这个结果会是多少呢?
byte b =(byte)130
//计算机中数据运算都是用补码进行计算的
/*
1获取130这个数据二进制
00000000 00000000 00000000 10000010 即128加2,这个即是130的原码和补码和反码,使用强制类型转换的时候直接将高位的数值位截取掉
截取之后剩下10000010,这个是补码,将补码转换为原码得到 11111110,对应的数值是-126
*/
当然,最最重要的,在实际的java开发中,我们尽可能不要出现=左右两边数据类型不相同的情况,只在相同的数据类型之间进行运算。
练习
byte b = byte(300)
还是相同的情况,将300对应的int类型的二进制数表示出来,截取掉前面3个字节
300/2 = 150..0
150/2 = 75..0
75/2 = 37..1
37/2 = 18..1
18/2 = 9..0
9/2= 4..1
4/2=2..0
2/2=1..0
1/2=0..1
对应的int类型的二进制数表示为
00000000 00000000 0000001 00101100
直接截取最后一个字节得到 00101100
这个二进制的原码为00101100=32+8+4=44
可以编译如下代码来验证一下结果的正确性
byte b = (byte)300;
System.out.println(b);
8.特殊的数值溢出
如下代码:
int a = 2^31-1;
//a这个时候是赋了一个最大int类型的整数
a = a + 1
这个是时候由于加1已经超过了int最大值,截取之后a会变成int最小值
五 数据类型 字符的ascii码表
java是强类型语句,凡是变量都必须要定义一个类型
数据类型分为基本数据类型和引用数据类型
引用数据类型:
类 接口 数组
基本数据类型
整数
byte short int long 分别占用 1 2 4 8个字节
浮点数
float double分别占用 4 8个字节
字符
char 占用1个字节
布尔
boolean 占用1个字节
数据类型转换
boolean类型不参与转换
当不同类型的变量或者常量进行运算的时候默认会按照从小到大的顺序进行转换,比如short和int型的数据进行会转换成int进行计算
char byte short这三种类型的数据进行计算的时候会统一转换成int型来进行计算
转载请注明原文地址: https://ju.6miu.com/read-671038.html