JavaSE—基础知识(一)(常量变量,数据类型以及运算符)
1.常量
1.1进制转换
-
任意进制到十进制——位权展开法
例如:a:二进制到十进制转换:0b1100=1*2^3+1*2^2+0*2^1+0*2^0 =12 b:八进制到十进制转换:01100=1*8^3+1*8^2+0*8^1+0*8^1 =576 c:十六进制到十进制转换:0x1100=1*16^3+1*16^2+0*16^1+0*16^0 =4352
-
十进制到任意进制——除基取余,直到商为零,余数反转
例如:a:十进制数52转为二进制:52/2=26余0 26/2=13余0 13/2=6余1 6/2=3余0 3/2=1余1 1/2=0余1 结果为:0b110100 b:十进制数52转为八进制:52/8=6余4 6/8=0余6 结果为:064 c:十进制数52转为16进制:52/16=3余4 3/16=0余3 结果为:0x34
-
任意进制到任意进制——以十进制为桥梁进行转换
例如:将0b100100转为十六进制 0b100100转换为十进制是36,36转换为十六进制是0x24 所以0b100100对应的十六进制就是0x24。
1.2有符号数据表示法(原码,反码,补码)
计算机底层在做运算的时候都是用补码进行运算的,一个正数的原码,补码,反码都一样,负数的反码是符号位不变,其它位取反,补码是反码加1。
例如:
符号位 | 数值位 | 原码 | 反码 | 补码 | |
---|---|---|---|---|---|
+7 | 0 | 0000111 | 0000111 | 0000111 | 0000111 |
-7 | 1 | 0000111 | 0000111 | 1111000 | 1111001 |
2.变量
(1)变量的概念:在程序执行过程中,在某个范围内其值可以发生改变的量。
(2)定义变量的原因:用来不断的存放同以类型的常量,并可以重复使用。
(3)格式:数据类型 变量名=变量值;
(4)使用变量的注意事项
- 相同的作用域(两个大括号中间的)中不能定义两个同名变量
- 没有初始化的变量不能使用
3.数据类型
-
为什么要有数据类型?
答:我们都知道,变量其实就是内存中的一小块区域。我们定义一个变量,其实就是开辟了一个内存空间。如果没有数据类型,那么我们需要开辟多大的内存空间合适呢?为了解决这种问题,java就给我们提供了不同的数据类型,那么针对不同的数据类型,在内存中分配了不同大小的内存空间。
(1)数据类型的分类
整数型 | 字节数 | 范围 |
---|---|---|
byte | 1 | -128~127 |
short | 2 | -2^15 ~ 2^15 - 1 |
int | 4 | -2^31 ~ 2^31 - 1 |
long | 8 | -2^63 ~ 2^63 - 1 |
浮点数 | 字节数 | 范围 |
---|---|---|
float | 4 | -3.40310^38 ~ 3.40310^38 |
double | 8 | -1.79810^308 ~ 1.79810^308 |
字符型 | 字节数 | 范围 |
---|---|---|
char | 2 | 0 ~ 2^16 - 1 = 65535 |
布尔型 | 字节数 | 范围 |
---|---|---|
boolean | 1 | true或false |
注意事项:整数默认是int型的,浮点型默认是double型的。
定义long类型数据时,值后面加上一个L后缀,表示这是一个long类型。
定义float类型数据时,值后面必须加上F后缀,表示这是一个float类型数据。
(2)数据类型转换——隐式转换(类型的自动提升)
class Demo{
public static void main(String[] args){
byte t1=3;
byte t2=4;
byte t3=t1+t2;
System.out.println(t3);
}
}
这个程序编译的话会报错,因为虽然t1,t2都是byte型,但t1+t2是int型,int型的4是个字节,byte类型装不下,所以报错。因为在byte,short,char型数据参与运算时,都会自动提升为int型。
正确的代码为:byte t3=(byte)t1+t2;
(3)数据类型转换——强制转换
例如:
class yao{
public static void main(String[] args){
byte t=(byte)130;
System.out.println(t);//输出结果是-126
}
}
因为130是4个字节的int类型的数据,而要转为byte类型的话,就会将前面三个字节丢弃,所以就剩下了最后一节。
00000000 00000000 00000000 10000010(补码)
1 0000010反码是1 0000001原码是1 1111110,结果就是-126。
注意:计算机在做底层运算时都是用补码来算的。
(4)字符或字符串参与运算
例如:
class yao1{
public static void main(String[] args){
System.out.println("Hello"+'a'+1);//输出是Helloa1
System.out.println('a'+1+"Hello");//输出是98Hello
}
}
‘a’的ASCII码值为97,所以程序中第二个输出就是’a’+1=98,再加”Hello“。
4.运算符
(1)算术运算符(++和–的用法)
单独使用:放在操作数的前面和后面都一样(都是自增或自减)。
参与运算使用:a:在操作时前面时,先自增或自减后参与运算。 b: 在操作数后面时,先参与运算后自增或自减。
class yao2{
public static void main(String[] args){
int n=1;
int h=(n++)+2+(++n)+4+(--n)+3+(n--)+1+(--n)+5;
System.out.println(n);//0
System.out.println(h);//23
}
}
详解:
(n++)+2 n=2,h=3
(++n)+4 n=3,h=10
(–n)+3 n=2,h=15
(n–)+1 n=1,h=18
(–n)+5 n=0,h=23
(2)赋值运算符
- 赋值运算符:=,+=,-=,*=,/=,%=
- 注意事项:赋值的左边的数据必须是一个变量
(3)逻辑运算符
- 逻辑运算符:&(与),|(或者),!(非),^(异或),&&(短路与),||(短路或)
- 注意事项:逻辑运算符一般用于连接boolean类型的表达式或者值。
- 结论:
&(与):有false则false,左边为false,右边依然执行。
&&(短路与):左边为false,则右边不执行,与&的最终结果都一样。
|(或者):有true则true
||(短路或):左边为true,则右边不执行。
^(异或):相同则为false,不同为true
(4)位运算符
- 位运算符:&(与),|(或),^(异或),~(按位取反),<<(左移),>>(右移),>>>(无符号右移)。
- 注意事项:位运算是用补码进行。 - 用法:
&:有0则0
|:有1则1
^:相同则0,不同为1
<<:左移,空位补0,被移除的高位丢弃。>>:被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,高位补1。>>>:被移位二进制最高位无论是0或者是1,空缺位都用0补。 - 举例:
10<<3 00001010 移后 01010000 结果为80
-25>>3 11101000 移后 11111101,原码是10000011,所以是-4