自动转换:将 取值范围小的类型 自动提升为 取值范围大的类型 。
PS:范围小的类型向范围大的类型提升, byte、short、char 运算时直接提升为 int,大致转换规则为byte、short、char——>int——>long——>float——>double
public static void main(String[] args){ byte b1=1; byte b2=2; byte b3=1 + 2; byte b4=b1 + b2; System.out.println(b3); System.out.println(b4); }
分析: b3 = 1 + 2 , 1 和 2 是常量,为固定不变的数据,在编译的时候(编译器javac),已经确定了 1+2 的结果并没有超过byte类型的取值范围,可以赋值给变量 b3 ,因此 b3=1 + 2 是正确的。 反之, b4 = b2 + b3 , b2 和 b3 是变量,变量的值是可能变化的,在编译的时候,编译器javac不确定b2+b3的结果是什么,因此会将结果以int类型进行处理,所以int类型不能赋值给byte类型,因此编译失败。
将取值范围大的类型 强制转换成 取值范围小的类型 。 比较而言,自动转换是Java自动执行的,而强制转换需要我们自己手动执行。
转换格式:数据类型 变量名 = (数据类型)被转数据值;
public static void main(String[] args) { //short类型变量,内存中2个字节 short s = 1; /* 出现编译失败 s和1做运算的时候,1是int类型,s会被提升为int类型 s+1后的结果是int类型,将结果在赋值会short类型时发生错误 short内存2个字节,int类型4个字节 必须将int强制转成short才能完成赋值 */ s = s + 1;//编译失败 s = (short)(s+1);//编译成功 }
正数:三码相同。
负数:原码:任意数(正数)除以2取余。(倒取)
反码:原码除最高符号位不变其余位置取反。
补码:反码加1
十进制常数160的原码、反码、补码为1010 0000
反码:1001 1111( 补码-1)
原码:1110 0000(反码取反)
-(1*2^6+1*2^5)=-96
public static void main(String[] args) { System.out.println(true && true);//true System.out.println(true && false);//false System.out.println(false && true);//false,右边不计算 System.out.println(false || false);//falase System.out.println(false || true);//true System.out.println(true || false);//true,右边不计算 System.out.println(!false);//true }
& | | | ^ | ~ | << | >> | >>> |
有0则0 | 有1则1 | 相同则0,不同则1 | 按位取反 | 左移 | 右移 | 无符号右移 |
左移:空位补0,被移除的高位丢弃。
注:当左移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。
右移:被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,高位补1空位1
无符号右移:被移位二进制最高位无论是0或者是1,空缺位都用0补。
0000 0101(5原反补)
1000 0011(-3原)
0000 0011(3原)
1111 1100(-3反)
1111 1101(-3补)
例:5|-3 1111 1101(补)——>1111 1100(反)——>1000 0011(原)——>-3
5^-3 1111 1000(补)——>1111 0111(反)——>1000 1000(原)——>-8
~-3 1111 1101(补)——>0000 0010(取反)——>三码合一——>2
三元运算符格式: 数据类型 变量名 = 布尔类型表达式?结果1:结果2
定义格式:
修饰符 返回值类型 方法名 (参数列表){ 代码... return ; }
定义格式解释:
修饰符: 目前固定写法 public static 。
返回值类型: 目前固定写法 void ,其他返回值类型在后面的课程讲解。(八大基本数据类型)
方法名:为我们定义的方法起名,满足标识符的规范,用来调用方法
参数列表: 目前无参数, 带有参数的方法在后面的课程讲解
return:方法结束。因为返回值类型是void,方法大括号内的return可以不写
public class Test7 { public static void main(String[] args) { printNum(); } public static void printNum(){ float f1=12345.01f; float f2 = 12345.00f; float var1 = f1 >= f2 ? 12456 : 12456.02f; float var2=var1+1024; System.out.println("var1的值为:" + var1 + "var2的值为:" + var2); } }
注:方法在定义完毕后,方法不会自己运行,必须被调用才能执行,我们可以在主方法main中来调用我们自己定义好的方法。在主方法中,直接写要调用的方法名字就可以调用了。