1:在定义Long或者Float类型变量的时候,要加L或者f。 整数默认是int类型,浮点数默认是double。 byte,short在定义的时候,他们接收的实际上是一个int类型的值。 这个是本身作了一个数据检测的,若是再也不它们的范围内,就报错。 2:byte值的问题 byte b1 = 127; byte b2 = (byte)128; //-128 byte b3 = (byte)129; //-127 byte b4 = (byte)130; //-126 byte的范围:-128 ~ 127 128:10000000 -128:10000000 (这里的1便是符号位,也是数值位) 3:数据类型转换之默认转换 byte,short,char -- int -- long -- float -- double long: 8个字节 float:4个字节 举例: 17.625在内存中的存储 首先要把17.625换算成二进制:10001.101 整数部分,除以2,直到商为0,余数反转。 小数部分,乘以2,直到乘位0,进位顺序取。 在将10001.101右移,直到小数点前只剩1位: 1.0001101 * 2^4 由于右移动了四位 这个时候,咱们的底数和指数就出来了 底数:由于小数点前必为1,因此IEEE规定只记录小数点后的就好。因此,此处的底数为:0001101 指数:实际为4,必须加上127(转出的时候,减去127),因此为131。也就是10000011 符号部分是整数,因此是0 综上所述,17.625在内存中的存储格式是: 01000001 10001101 00000000 00000000 A:它们底层的存储结构不一样。 B:float表示的数据范围比long的范围要大 long:2^63-1 float:3.4*10^38 > 2*10^38 > 2*8^38 = 2*2^3^38 = 2*2^114 > 2^63-1 4:Java语言中的字符char能够存储一个中文汉字吗?为何呢? 能够。由于java语言中的字符占用两个字节。 Java语言采用的是Unicode编码。 System.out.println(x/y); //整数相除只能获得整数 //我就想获得小数,该肿么办呢? //只须要把操做的数据中任意的一个数据变为浮点数 System.out.println(x*1.0/y); 注意事项: A:整数相除只能获得整数。若是想获得小数,必须把数据变化为浮点数类型 B:/获取的是除法操做的商,%获取的是除法操做的余数 &&和&的区别? 同理||和|的区别? A:最终结果同样。 B:&&具备短路效果。左边是false,右边不执行。 开发中经常使用的逻辑运算符:&&,||,! ~按位取反运算符:0变1,1变0(System.out.println(~3)) 00000000 00000000 00000000 00000011 ~11111111 11111111 11111111 11111100 (补码) 补码:11111111 11111111 11111111 11111100 反码:11111111 11111111 11111111 11111011(补码减1) 原码:10000000 00000000 00000000 00000100(反码符号位不变,其余位置0变1,1变0) 结果是:-4 (正数的原反补都相同) /* ^的特色:一个数据对另外一个数据位异或两次,该数自己不变。 */ class OperatorDemo2 { public static void main(String[] args) { int a = 10; int b = 20; System.out.println(a ^ b ^ b); //10 System.out.println(a ^ b ^ a); //20 } } /* 面试题: 请本身实现两个整数变量的交换 注意:之后讲课的过程当中,我没有明确指定数据的类型,默认int类型。 */ //方式2:用位异或实现(面试用) //左边:a,b,a //右边:a ^ b /* a = a ^ b; b = a ^ b; //a ^ b ^ b = a a = a ^ b; //a ^ b ^ a = b System.out.println("a:"+a+",b:"+b); */ //方式4:一句话搞定 b = (a+b) - (a=b); //b=30-20=10,a=20 System.out.println("a:"+a+",b:"+b); /* <<:左移 左边最高位丢弃,右边补齐0 >>:右移 最高位是0,左边补齐0;最高为是1,左边补齐1 >>>:无符号右移 不管最高位是0仍是1,左边补齐0 面试题: 请用最有效率的方式写出计算2乘以8的结果? 2 * 8 2 << 3 */ class OperatorDemo3 { public static void main(String[] args) { //<< 把<<左边的数据乘以2的移动次幂 System.out.println(3 << 2); //3*2^2 = 3*4 = 12; //>> 把>>左边的数据除以2的移动次幂 System.out.println(24 >> 2); //24 / 2^2 = 24 / 4 = 6 System.out.println(24 >>> 2); System.out.println(-24 >> 2); System.out.println(-24 >>> 2); } } /* 计算出3的二进制:11 00000000 00000000 00000000 00000011 (00)000000 00000000 00000000 0000001100 >>的移动: 计算出24的二进制:11000 原码:10000000 00000000 00000000 00011000 反码:11111111 11111111 11111111 11100111 补码:11111111 11111111 11111111 11101000 11111111 11111111 11111111 11101000 1111111111 11111111 11111111 111010(00) 补码 补码:1111111111 11111111 11111111 111010 反码:1111111111 11111111 11111111 111001 原码:1000000000 00000000 00000000 000110 结果:-6 >>>的移动: 计算出24的二进制:11000 原码:10000000 00000000 00000000 00011000 反码:11111111 11111111 11111111 11100111 补码:11111111 11111111 11111111 11101000 11111111 11111111 11111111 11101000 0011111111 11111111 11111111 111010(00) 结果: */ //报错 //int z = ((x = y)? x : y);//结果是一个boolean类型。 if语句第一种格式: if(关系表达式) { 语句体 } if语句第二种格式: if(关系表达式) { 语句体1; }else { 语句体2; } if语句第三种格式: if(关系表达式1) { 语句体1; }else if (关系表达式2) { 语句体2; } … else { 语句体n+1; }