一、数据类型
1.Java数据类型划分,见下图:
数据类型.png2.Java基本数据类型的大小、范围、默认值,见下图:
Java基本数据类型的大小、范围、默认值.jpg如果超过了int的最大值或最小值的结果,会怎么样呢?
public static void main(String[] args) {
int max = Integer.MAX_VALUE; //取出最大值
int min = Integer.MIN_VALUE; //取出最小值
System.out.println(max); //2147483647
System.out.println(min); //-2147483648
//int变量 +/- int型常量 = int型数据
System.out.println(max + 1); //最大值加1:-2147483648
System.out.println(min - 1); //最小值减1:2147483647
System.out.println(min - 2); //最小值减2:2147483646
}
由于max或min变量都属于int型变量,而当int型变量与int型变量进行计算后其结果依然是int型。但是此时由于计算超过了其保存的范围,就会出现一个循环的操作,最大值如果继续增加就会变为最小值,随后一直向其次的最小值进行循环,反之最小值减1就变为最大值,此种现象称为数据的溢出,如下图所示。
数据类型溢出.png如果学习过汇编语言的同学应该知道,在计算机中二进制是基本的组成单元,而int型数据一共占32位长度,也就是说第一位是符号位,其余的31位都是数据位。当数据已经是该数据类型保存的最大值时,如果继续进行“+1”的操作就会造成符号位的变更,最终就会形成这种数据溢出的问题。
注:
1.在Java中所有整数内容默认情况下都是int型数据;所有小数默认类型都是double。
2.转义字符:换行(\n)、制表符(\t)、\(\\)、双引号(")、单引号(')
二、自增运算符(++)&自减运算符(--)
1.
int x = 10;
int y = x++*2;
计算后得到:
x = 11;
y = 20;
**注:“++”放在变量x之后,表示先使用x计算,之后x的内容再自增。
2.
int x = 10;
int y = ++x*2;
计算后得到:
x = 11;
y = 22;
**注:“++”放在变量x之前,表示先将x的内容自增,再进行计算。
自减运算符同理~
三、位运算符
1.与运算符(按位与) &
int x = 19&20; //x=16
19转二进制:10011
20转二进制:10100
按位与结果:10000,即16
注:只有两个位都是1,结果才是1
2.或运算符(按位或) |
int x = 19|20; //x=23
19转二进制:10011
20转二进制:10100
按位或结果:10111,即23
注:只要两个位有一个是1,结果为1
3.非运算符(按位非) ~
int x = ~19; //x=-20
简单记忆方法:
~19: 19+1=20,取反为-20;
~(-5): -5+1=-4,取反为4
按位非(非运算符)运算规律如下:
~(-5):
~(-5)计算过程.png
~19 :
~19计算过程.png
慢着,之前按照简单记忆方法,~19的值不是-20吗,怎么这边算出来为-18了?网上查了下说正数的原码、反码、补码一样,WTF! 而且正数的按位非计算过程和负数的还不一样,见下图:
~19 :
~19计算过程.png
~5 :
~5计算过程.png
分析以上计算过程可知,正数和负数的按位非计算过程完全相反:
负数的按位非计算过程:原码除符号位外取反,加1,取反得到结果
正数的按位非计算过程:原码取反,减1,除符号位外取反得到结果
4.异或运算符(异或) ^
int x = 19^20; //x=7
19转二进制:10011
20转二进制:10100
异或结果:00111,即7
注:相同为0,不同为1
5.左移位 <<
int x = 19<<2; //x=76
简单记忆方法:
19*2^2 = 19*4 = 76
**
规则:
1.丢弃最高位,0补最低位;
2.当左移的运算数是int类型时,每移动1位它的第31位就要被移除并且丢弃;
3.当左移的运算数是long类型时,每移动1位它的第63位就要被移除并且丢弃;
4.当左移的运算数是byte和short类型时,将自动把这些类型扩大为int类型。
**
19<<2:
注:如对int类型移动33位,超过了该类型最大位数,实际上只移动了1位。
6.右移位 >>
int x = 19>>2; //x=4
简单记忆方法:
19/(2^2) = 19/4 ,取整为4
规则:符号位不变,左边补上符号位(符号位扩展)
19>>2:
19右移两位.png
6.无符号右移位 >>>
int x = 19>>>2; //x=4
规则:忽略了符号位扩展,0补最高位
注:只对32位和64位的值有意义
四、请解释&和&&、|和||的区别?
(1)逻辑运算
1.与运算分为普通与(&)和短路与(&&)两种
&: 所有的判断条件都要判断;
&&: 如果前面的判断返回false,后面不再判断,最终结果就是false。
2.或运算分为普通或(|)和短路或(||)两种
|: 所有的判断条件都要判断;
||: 如果前面的判断返回true,后面不再判断,最终结果就是true。
(2)位运算
位运算包括位与运算(&)、位或运算(|),其中"&&"和"||"不能应用在位运算上。
网友评论