1基本数据类型
1如果直接将一个较小的整数常量(在byte或short类型的表述范围内)赋给一个byte或short变量,系统会自动把这个整数常量当成byte或者short类型来处理(系统默认整数常量是int)。
2如果使用一个巨大的整数常量(超出了int类型的表数范围)时,Java不会自动把这个整数常量当成long类型来处理。如果希望系统把一个整数常量当成long类型来处理,应在这个整数常量后增加l或者L作为后缀。
3Java中整数常量有4中表示方式。
4所有数字在计算机底层都是以二进制形式存在的,原码是直接将一个数值换算成二进制制数,但计算机以补码的形式保存所有的整数。补码的计算规则:正数的补码和原码完全相同,负数的补码是其反码加1;反码是对原码按位取反,只是最高位(符号位)保持不变。
例子:
// 定义二个8位的二进制数 int binVal1 = 0b11010100; byte binVal2 = 0b01101001; // 定义一个32位的二进制数,最高位是符号位。 int binVal3 = 0B10000000000000000000000000000011; System.out.println(binVal1); // 输出212 System.out.println(binVal2); // 输出105 System.out.println(binVal3); // 输出-2147483645
图示:
5Java语言使用16位的Unicode字符集作为编码方式。一共可以表示65535个字符,其中前256个字符和ASCII码中的字符完全重合。
6Java有3个特殊的浮点数值:正无穷大,负无穷哒和非数,用于表示溢出和出错。例如,使用一个整数除以0将得到正无穷大,使用一个负数除以0将得到负无穷大,0.0除以0.0或对一个负数开方将得到一个非数。正无穷大通过Double或Float的POSITIVE_INFINITY表示;负无穷大通过Double或Float的NEGATIVE_INFINITY表示,非数通过Double或Float的NaN表示。所有的正和负穷大都是相等,而NaN不与任何数值相等,甚至和NaN都不相等。
7在Java语言中,boolean类型的数值只能是true或false,不能用0或者非0来代表其他基本数据类型的值也不能转换成boolean类型。
8所有的byte类型,short类型和char类型将被提升到int类型。整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。
//下面代码将出错:表达式中的sValue将自动提升到int类型, //则右边的表达式类型为int,将一个int类型赋给short类型的变量将发生错误。 sValue = sValue - 2;2运算符
1 若果把++或--放在左边,则先把操作数加1,然后才把操作数放入表达式中运算,如果把++或--放在右边,则先把操作数放入表达式中运算,然后才把操作数加1.自增只能操作变量,不能用于操作数值直接量或常量。
2 由于求余运算也需要进行除法运算,因此如果求余运算的两个操作数中有1个或者2个都是浮点数,则允许第二个操作数是0或0.0,只是求余运算的结果是非数:NaN。0或0.0对零以外的任何数求余都将得到0或0.0.
3~-5的运算过程:
3左移运算符是将运算数的二进制码整体左移指定位数,左移后右边空出来的位以0填充。右移运算符有两个:>>和>>>,对已>>>运算符而言,把第一个操作数的二进制码右移指定位数后,左边空出来的位以原来的符号填充,即如果第一个操作数原来是正数,则左边补0;如果第一个操作数是负数,则左边补1.>>>是无符号右移运算符,它把第一个操作数的二进制码右移指定位数后,左边空出来的位总是以0填充。
例子:
4对于低于int类型(如byte,short和char)的操作数总是先自动类型转换为int类型后在移位。对已int类型的整数移位a>>b,当b>32时,系统先用b对32求余(因为int类型只有32位),得到的结果才是真正移位的位数。例如,a>>33和a>>1的结果完全一样,而a>>32 的结果和a相同。对已long类型的整数移位a>>b,当b>64时,系统先用b对64求余(因为int类型只有64位),得到的结果才是真正移位的位数。例如,a>>65和a>>1的结果完全一样。
5&与&&的区别:&总会计算前后两个操作数,而&&先计算左边的操作数,如果左边的操作数为false,则直接返回false,根本不会计算右边的操作数。 |与||也类似。