Java学习笔记之程序基本概念

2017-07-19  本文已影响0人  丶Castiel

一、数据类型

1.Java数据类型划分,见下图:

数据类型.png

2.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:

19左移两位.png
注:如对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)位运算

位运算包括位与运算(&)、位或运算(|),其中"&&"和"||"不能应用在位运算上。

上一篇下一篇

猜你喜欢

热点阅读