1.main函数参数列表
public static void main(String[] args) 中的(String[] args)是参数列表,args只是参数名,可以随便改写。
2.数据类型
区分数据类型的目的是区分占用内存位数的多少,通过占用内存大小分为不同的类型。
2.1 short类型和char类型的转换
内存占用情况:short占用2个字节,char占用两个字节。
问题:short的范围是-32768~32767,char的范围是0~65535,short类型的值转换成二进制是有一位符号位的,所以当short和char进行转换的时候,char类型会将short的符号位当成数值位来计算,造成偏差。但是当使用int与char进行转换时,由于int大小为4字节,即从低到高第16位仍旧是数值位,所以不会出现上述问题。
结论:在自动类型转换中需要比较char时,应当舍弃short和byte,直接从int开始,即char --> int --> long --> float --> double
2.2 float类型与int类型转换时出现的精度丢失问题
内存占用情况:在内存中,float占用4个字节(32位)。
其中,最高的1位是符号位,接下来的8位组成指数部分,最后的23位是尾数部分。这就限制了float类型数值可以表示的指数范围和长度范围。
因此,在下面的代码中,当int类型的数值在向float类型转换时,由于float尾数只有23位,所以无法完整表示123456789,将最后两位赋予了近似值。
int i = 123456789;
float f = i;
System.out.println(f);
i = (int)f;
System.out.println(i);
//输出结果:
//1.23456792E8
//123456792
即使将float类型的数值再次转换为int类型,原来的数据也已经丢失。
结论:可以使用double类型取得更好的转换效果。
tips:即使采用了double,也会存在精度丢失的风险,因为计算机在表示一个数字时,宽度是有限的,而由浮点数转换而来的二进制数很容易不是有限的,那么计算机就只能将其截断,然后导致小数精度发生损失。
3.移位运算符
<< 左移运算:二进制数右边补0,删除左边非符号的第一位,相当于该数乘2。
>> 右移运算:二进制数删除最后一位,在左边非符号的第一位补0或1(正数补0,负数补1),相当于该数除以2。
>>> 右移运算(不考虑符号位):二进制数删除最后一位,在左边第一位补0,存在改变符号位导致负数变正数的可能。