JAVA基础2——进制运算&数据类型&变量
常量
进制转换
原反补码
变量
数据类型
数据类型转换
字符和字符串运算规则
常量
常量:在程序执行的过程中其值不可以发生改变
Java中常量的分类
字面值常量
自定义常量(面向对象部分讲)
字符串常量——用双引号括起来的内容
整数常量——所有整数
小数常量——所有小数
字符常量——用单引号括起来的内容,里面只能放单个数字,单个字母或单个符号
布尔常量较为特殊——只有true和false
空常量null(数组部分讲解)
public class Dome1_Constant { //constant 常量
public static void main(String[] args){
System.out.println("abc123;;;"); //字符串常量
System.out.println(564566); //整数常量
System.out.println(456.456456); //小数常量
System.out.println('abc123;;;'); //''中必须放的是单个字符,10代表的是1字符和0字符
System.out.println(''); //中什么也不放,也是不可以的,因为代表不了任何字符
System.out.println(' '); //带表空格字符
System.out.println(true); //boolean类只有两个值,true和fals
System.out.println(false);
}
}
下面是错误提示:
进制转换
二进制
由0,1组成。以0b(b可以大写也可以小写)开头(JDK1.7版本可以表示二进制了)
八进制
由0…7组成。以0开头
十进制
由0…9组成。整数默认是十进制的
十六进制
由0…9,a,b,c,d,e,f(大小写均可)。以0x开头
任意进制到十进制的转换原理
系数:就是每一位上的数据。
基数:x进制,基数就是x。
权:在右边,从0开始编号,对应位上的编号即为该位的权。
结果:把系数×基数的权次幂相加即可。
十进制到其他进制转换
规律:除基取余,直到商为0,最后,余数反转就是结果。
8421快速转换法
1
1
1
1
1
1
1
1
1*27
1*26
1*25
1*24
1*23
1*22
1*21
1*20
128
64
32
16
8
4
2
1
十进制到其他进制时先转为二进制,然后二进制再转换为其他进制
104=64+32+8=01101000
二进制到八进制:
从右往左,每三位一组合,左边不够用0补。
把组合后的每一位换算成十进制数据。
最后,从左往右,把结果进行组合即可。
01101000=001 101 000=150
二进制到十六进制:
从右往左,每四位一组合,左边不够用0补。
把组合后的每一位换算成十进制数据。
最后,从左往右,把结果进行组合即可。
对应位上的数据,应该是十六进制的。
01101000=0110 1000=68
原反补码
原码:是二进制数的有符号表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
举例
符号位
数值位
+7
0
000 0111
-7
1
000 0111
在计算机中,数值一律用补码来表示(存储)。
主要原因:
使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。
另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
正数:原反补码相同
负数:
反码符号位不变,数值位按位取反,0变1,1变0。
举例
符号位
数值位
+7
0
000 0111
-7
1
111 1000
补码 =反码加1
举例
符号位
数值位
+7
0
000 0111
-7
1
111 1001
变量
声明变量的格式:
数据类型 变量名 = 初始化值;
byte b = 10;
System.out.println(b);
数据类型 变量名;
变量名 = 初始化值;
使用变量
byte b;
b = 20;
System.out.println(b);
数据类型
分类
基本数据类型
引用类型(类,接口,数组)
基本数据类型
4类8种,区别在于他们在内存中的存储空间大小不一样。
类别
种类
名称
占位
范围
说明
整数
字节
byte
占1个字节
-128~127
短整型
short
占2个字节
-215~215-1
整型
int
占4个字节
-231~231-1
长整型
long
占8个字节
-263~263-1
其后跟L或者l标示
浮点数
单精度
float
占4个字节
-3.403E38~3.403E38
其后跟F或者f标示
双精度
double
占8个字节
-1.798E308~1.798E308
字符
char
占2个字节
0~65535
布尔
boolean
占1个字节
理论上是占1/8个字节,但java中没指定其大小
true\false
注意:整型默认是int;浮点型默认是double。
public class Dome1_DataType {
public static void main(String[] args){
//整数
byte b=127;
int i=43524;
long l=5345768342L;//后面最好标注大写L
short s=5635;
System.out.println(b);
System.out.println(i);
System.out.println(l);
System.out.println(s);
//浮点数
float f=3242.234234234F;//后面最好标注F or f
double d=234234.2352342342342357658;
System.out.println(f);
System.out.println(d);
//字符
char c='a';
System.out.println(c);
//布尔
boolean b1=true;
boolean b2=false;
System.out.println(b1);
System.out.println(b2);
}
}
作用域问题 : 同一个区域不能使用相同的变量名
初始化值问题 : 局部变量在使用之前必须赋值
一条语句可以定义几个变量
数据类型转换
数据参与运算
参与运算的数据类型要一致。
转换规则
布尔型不能参与运算
整形,字符型,浮点型的数据在混合运算中相互转换,转换时遵循以下原则:
容量小的类型默认转换为容量大的数据类型;
数据类型按容量大小排序为:
byte,short,char-byte,short,char之间不会互相转换,他们三者在计算时首先会转换为int类型
容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精度降低或溢出;使用时要格外注意
有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一种数据类型,然后再进行计算
public class Dome_DataTypeConversion { //conversion 转换
public static void main(String[] args){
//隐式转换
int a=8;
byte b=10;
a=a+b;
System.out.println(a);
//强制转换
int x=9;
byte y=7;
y= (byte) (x+y);
System.out.println(y);
byte b1= (byte) (120+79);
byte b2=(byte)300;
System.out.println(b1);
System.out.println(b2);
}
}
错误代码示范
public class Dome1_DataTypeConverson1 {
public static void main(String[] args){
byte x1=3;
byte x2=6;
byte x3=x1+x2;
/* 1,byte与byte(或short,char)进行运算的时候会提升为int,两个int类型相加的结果也是int类型
2,x1和x2是两个变量,变量存储的值是变化,在编译的时候无法判断里面具体的值,相加有可能会超出byte的取值*/
byte x4=3+6;
System.out.println(x3);
System.out.println(x4);//x4可以正常输出的原因是java有常量优化机制
}
}
错误提示:
注意:
变量无法直接运算,而常量可以
因为java有常量优化机制
float为什么比long大?
long有8个字节而float有4个字节
IEEE754规定
4个字节是32个二进制位 1位是符号位 8位是指数位 23位是尾数位
00000000——11111111
0到255 其中0代表0 255代表无穷大
1到254每个指数位减去127
-126到127
long:2 63 − 1 2^{63}-1263−1
float:3.4 × 1 0 38 > 2 × 1 0 38 > 2 × 8 38 = 2 × 2 3 38 = 2 × 2 114 > 2 63 − 1 3.4×10^{38}>2×10^{38}>2×8^{38}=2×{2^3}^{38}=2×2^{114}>2^{63}-13.4×1038>2×1038>2×838=2×2338=2×2114>263−1
它们底层的存储结构不同。
float表示的数据范围比long的范围要大
字符和字符串运算规则
public class Dome_DataTypeConversion2 {
public static void main(String[] args){
System.out.println('a'+1); //98,因为有ASCII码表,a字符对应的是int类型的97
System.out.println((char)('a'+1));
System.out.println("he11o"+'a'+1); //任何数据类型用+与字符串相连接都会产生新的字符串
System.out.println('a'+1+"hello");
System.out.println("5 + 5 = " + ( 5 + 5 ));
}
}
运行结果如下
Java语言中的字符char可以存储一个中文汉字吗?
可以。因为Java语言采用的是Unicode编码。Unicode编码中的每个字符占用两个字节。中文也是占的两个字节。所以,Java中的字符可以存储一个中文汉字
//char类型是否可以存储中文
char c='中';
System.out.println(c);