1.原码反码补码
(1)0正1负
(2)正数的原码反码补码都相同
(3)负数的反码是对其原码逐位取反,符号位除外;负数补码是反码加一。
PS:二进制中,1+1相加,等于0进1
2.数据类型
定义的格式:变量名 = 变量值;
数据类型分类(要背)
(1)整数型 (整数默认的数据类型int)
byte 占一个字节 -128到127
注:byte为什么在-128到127之间,首先byte为一个字节占八位,最大二进制01111111,换算成二进制数为127,最小二进制1000000(补码),求出原码,换算成十进制就是-128
short 占两个字节 -2^15到2^15-1
int 占四个字节 -2^31到2^31-1
long 占八个字节 -2^63到2^63-1
注意点:
①long定义
其中long类型的定义比较特殊
例:long x = 89738568L; (在数字末尾要加上L)
②byte在运算过程中,会遇到超出取值范围的情况
例:byte b = (byte)(126 + 4);
System.out.println(b); //输出-126
这个括号部分属于强制类型转化,式子已经超出了byte 的取值范围,但是强行定义b为byte类型,因此超出部分将从负数开始计算。
在把一个值赋值给另一个值的时候,小的数据类型可以直接赋值给大的数据类型(隐式转换)
(2)浮点型 (小数默认的数据类型是double)
float 占四个字节 -3,403E38到3,403E38 单精度
double 占八个字节 -1,798E308到1,798E308 双精度
float定义末尾要加f
例:float x = 3.222f
(3)字符型
char 占两个字节 0到65535
例:char a = ‘b’; //输出b
char b = 97; //输出a,对应的是ASCII码表,取值范围是0到65535
PS:char可以存储中文,但是只能存储一个汉字
如:char = ’你‘;
(4)布尔型
boolean 理论上是占八分之一个字节,因为一个开关就可以决定true和false了, 但是Java中没有明确规定它的大小
3.变量相加和常量相加的区别(要背)
byte a1 = 3;
byte a2 = 4;
byte a3 = a1 + a2;
System.out.println(a3);
上面的程序在运行的时候会出现报错,会损失精度。
原因:(1) byte与byte(或short或char)运算会提升为int,。
(2)a1和a2是两个变量,变量存储的值是变化的,在编译的时候无法判断里面具体的值,相加有可能会超出byte的取值范围。
例:byte a4 = 3 + 4; //不会报错
上面显示的常量相加, Java编译器有常量优化机制。
4.数据类型之间的转化
在运算过程中,小的运算范围会自动提升为大的
byte,short,char——int——long——float——double
PS:float要比long要大
5.字符和字符串参与运算(易错点)
例1:
System.out,println(‘a’+ 1 );
得到98,因为有ASCII码表,刚刚上面说了,char类型会自动变为int类型,
a代表97,因此此处输出为98。
System.out.println( (char ) (’a’+ 1));
得到b,因为用了强制转化类型。
例2:
System.out.println(“hello” + ‘a’ + 1);
得到helloa1,任何数据类型用+与字符串相连接都会产生新的字符串
System.out.println(‘a’+ 1 + “hello”);
得到98hello,因为字符串在后面,先计算前面的值,而前面的值为98。
乱入的知识点:
整数相除,结果只能得到整数,要得到小数,必须把数据强制变为浮点类型。
System.out.println( 10 / 4 ); //输出2
System.out.println( 10 / 4.0 ); //输出2.5,把其中一个改成小数,就可以得到小数,另一个自动提升。
PS:整数和小数进行运算时,是double类型,不是int类型。
6.运算符
(1)取余 %
当左边的绝对值小于右边的数时,结果为左边。
System.out.println( 2 % 5 ); //得到2
System.out.println( -2 % 5); //得到-2
System.out.println( -12 % 5); //得到-2
当左边的绝对值等于右边的数或者倍数时,结果为0。
System.out.println( -5 % 5); //得到0
当左边的绝对值大于右边的绝对值大于右边,结果为余数。
System.out.println( -13 / 10); //得到-3
PS:得到值得正负,是由左边的正负决定的,与右边的正负无关
任何正整数 % 2,不是1就是0,可以用来当做切换条件
(2)++- -
不管是a++还是++a,a的值都会+1
例1:
a = 3;
b = a++; // 此时a = 4,b = 3,原因是a碰到了a++,因此a的值+1,b还是原来的数。原因是++在后面,先赋值再自身+1.
b = ++a ; //此时a = 4, b = 4, 原因是a此时遇到了++a,因此a的值+1。当++在前面的时候,先进行自身+1再进行赋值。
例2:int x = 4;
int y = (x++)+(++x)+ (x*10)
4 6 60
最后的值为70
(要背)
byte b = 10;
b++; //不会报错,因为b++是一个运算符,在运算的时候,会自动加强制转转化符,b = (byte)(b + 1)
b = b + 1; //会报错,损失精度。因为10,1都是int类型,运算结果自动变为int型,byte和int混合运算时,会自动提升为int,所以byte会损失精读。
(要背)
程序:short s = 1; s = s +1;
System.out.println(s);
// 报错原因,short与int类型进行运算,自动变为int类型,损失精度。
short s = 1; s += 1;
// 不会报错,因为+=是一个运算符,相当于加了一个强制转换符,
b = (byte)(b + 1)
(3)关系运算符
只会出现true 和 false
一个=为赋值,==为比较
直接上例子
System.out.println( 4 == 3); //false
System.out.println( 4 != 3); //true
System.out.println( 4 > 3); //true
System.out.println( 4 >= 3); //true
(4)逻辑运算符
1> & 逻辑与(并且), 有false则false
int a = 3;
int b = 4;
int c = 5;
System.out.println(a < b & b < c); //true & true = true
System.out.println(a < b & b > c); //true & false = false
System.out.println(a > b & b < c); //false & true = false
System.out.println(a > b & b > c); //false & false = false
&与&&的区别:
二者最终结果是一样的,但是&&具有短路效果,左边是false,右边不执行。
2> | 逻辑或 ,有true 则true
int a = 3;
int b = 4;
int c = 5;
System.out.println(a < b | b < c); //true | true = true
System.out.println(a < b | b > c); //true | false = true
System.out.println(a > b | b < c); //false | true = true
System.out.println(a > b | b > c); //false | false = false
单 | 与双 || 的区别:两者最终结果是一样的,当时 || 具有短路效果,左边是true,右边不执行。 2.
3> ^ 逻辑异或,两边相同为false
int a = 3;
int b = 4;
int c = 5;
System.out.println(a < b ^ b < c); //true ^ true = false
System.out.println(a < b ^ b > c); //true ^ false = true
System.out.println(a > b ^ b < c); //false ^ true = true
System.out.println(a > b ^ b > c); //false ^ false = false
4> !逻辑非,
System.out.println(!true);
System.out.println(!!true);
第一个为false,第二个true
(5)位运算符(了解)
① 位与 &
System.out.println( 6 & 3 ); // 0110 & 0011,遇0则0,0010,输出2
② 位或 |
System.out.println( 6 | 3 ); // 0110 | 0011, 遇1则1,0111,输出7
③ 位异或 ^
System.out.println( 6 ^ 3 ); // 0110 ^ 0011, 两边相同则为0,0101,输出5
PS:一个数据被同一个数据异或两次结果等于本身。
④ 取反~
System.out.println(~6); //输出-7
6是int类型,四个字节,有32位。运算都是补码运算
00000000 00000000 00000000 00000110 6的原码反5补码都是本身
11111111 11111111 11111111 11111001 按位取反的结果,这是补码
11111111 11111111 11111111 11111001
- 00000000 00000000 00000000 00000001
11111111 11111111 11111111 11111000 这是反码
10000000 00000000 00000000 00000111 这是原码,代表-7
⑤左移 << (左边最高位丢弃,右边补齐0)
System.out.println(12 << 1); //输出24
System.out.println(12 << 2); //输出48
向左移动几位,就是乘以2的几次幂
⑥右移 >>
System.out.println(12 << 1); //输出6
System.out.println(12 << 2); //输出3
向右移动几位,就是除以2的几次幂
(6)三元运算符
(关系表达式)? 表达式1 : 表达式2;
int x = 10;
int y = 5;
int z;
z = (x > y) ? x : y;
输出10
例1:判断两个整数是否相同
int x = 5;
int y = 10;
boolean b = ( x == y ) ? true : false;
或者直接写 boolean b = ( x == y ); //因为==本身就是比较
例2:判断三个数中的最大值