第3章:数据类型和运算符

3.1 数据类型分类

3.1.1 基本数据类型
3.1.2 引用类型

类,接口,数组,null,引用类型无法转为基本类型

3.2 基本数据类型

3.2.1 整型
  1. byte正好对应1个字节,1个字节包含8位(bit),即可以用8位的2进制数表示
  2. 字节流正好对应一个个字节,一般用byte[]存放
  3. 由于byte只有8bit,表示数字的大小有限,因此产生了其他数据类型
  4. 各整型字节数
    1. byte:1
    2. short:2
    3. int:4
    4. long:8
  5. java中根据整数的值,默认一个类型,例如20就是byte型,129就是short,当使用时,又自动转为int型,而如果该数值,超过了int上线,就会报错,必须后面加L、l强转为long型
//java认为2147483648为int型,但这个值又超过了int的最大值,所以报错
//需要后面加L表示输入的是一个long型的数字
//long a = 2147483648;
long a = 2147483648L;
3.2.2 字符型:char(2个字节)

char型包含两个字节,16位,且第一位不表示正负,所以其取值范围为0-65535(2的16次方-1) 。计算机底层保存char型时,实际保存该字符所在系统的默认字符集(windows为Unicode)的编号的值(数字),因此char类型的值可以直接与整型互相转换、运算。unicode编码值的范围为0-65535,unicode编码的前256个字符与ASCII码中的字符完全重合,即’a’的unicode值与ASCII值相同都为97。注意char型与ASCII编码一点关系都没有,不要往一起考虑

  1. 三种表示方法:
//第一种
char a = '9';//该值转为int型后为57,即9的ASCII值为57
char b = 'A';//65
//第二种
//退格
char c = '\b';
//回车符
char d = '\r';
//第三种:\u后表示的是一个十六进制数
char e = '\u1234';
  1. \为转译符号,所以字符串中如果遇到\为避免系统将其当做转译,在其前面再加一个\
//String a = "C:\codes";
String a = "C:\\codes";
3.2.3 浮点型:float(4个字节),double(8个字节)
  1. java使用二进制数据的科学计数法表示浮点型,因此无法精确表示浮点数
  2. java默认小数都为double型,如果需要float型,需要后加f、F强转
//float a = 3.14;
float a = 3.14f;
  1. 自动装箱时,基本类型只能自动装箱为其对应的自动装箱类型,例如int只能转为Integer,不能转为Long
//错误写法:512系统默认为int型,无法自动装箱为Double
//Double a = 512;
//正确写法
//1. 改为基本类型+自动类型转换
double a = 512;
//2. 512后面加d、小数点、e2,强转为double
Double b = .12;
Double c = 512.0;
Double d = 512d;
Double e = 5.12e2;

//错误写法:系统默认3为byte型,可以自动转为int型,3.0为double型,无法自动装箱为Float
//Float a = 3;
//Float a = 3.0;
//正确的写法
//1. 改为基本类型+自动类型转换
float a = 3;
//2. 3后面+f强转为float型
Float a = 3f;

3.2.4 布尔型:boolean
  1. 只能为true或false,不能用0或非0表示
  2. 布尔型转String
boolean a = true; 
String b = a+"";

3.3 基本类型转换

3.3.1 自动类型转换
  1. byte–>int:高位直接补符号位
    1. byte为00000001,int为左边补24个0
    2. byte为10000001,int为左边补24个1
//操作数的等级排列
//byte-->short-->int-->long-->float-->double
//char-->int
System.out.println(3+4+"Hello");//7Hello
System.out.println("Hello"+3+4);//Hello34
3.3.2 强制类型转换
  1. int–>byte:截断,精度丢失
32int00000000000000000000000011101001
截断成8byte11101001
发现由1开头,是补码,应该转源码,先-111101000
再取反:00010111
转为10进制,值为-23
3.3.3 表达式类型的自动提升
  1. byte、short、char将被提升到int
  2. 表达式,按运算顺序,每次结果的数据类型,都自动提升到最高等级操作数同样的类型
//例2
byte b1 = 3;
byte b2 = 4;
//由于b1和b2都提升为int进行计算,所以b1+b2为一个int型数,将int转为byte时,无法自动转换,所以报错
//byte b3 = b1+b2;

//例1
//先计算5/2,结果还是int型,所以为2,再犹int转为double,变为double型,所以结果为2.0
double a = 5/2;
//算计算5.0/2,自动提升为与5.0相同的double型,因此结果为2.5
double b= 5.0/2;
  1. null可以赋值给任何引用类型的变量
  2. ==对于引用类型,为判断地址是否相同,对于基本类型是判断值是否相同

3.4 运算符补充

3.4.1 二进制
  1. 基数:radix,二进制基数为2,十进制基数为10
  2. 其他进制转十进制:各位置上数值*基数的位数次幂的加和
//二进制00100001转十进制
1*25次幂+1*20次幂=33
//十六进制AF转十进制
A*161次幂+F*160次幂=175
  1. 十进制转其他进制:短除法
  2. java中八进制、十六进制的表示法
    1. 八进制:0开头的数字,例如010表示十进制的8
    2. 十六进制:0x开头的数字,例如0xAF表示十进制的175,十六进制实际上是二进制的短的表示方法
  3. 负数的二进制表示
    1. 负数的源码,是由其正数的二进制源码,开头改为1得到的
    2. 但计算机中负数是以补码的形式存在的
    3. 补码就是源码除了第一位表示符号位之外的所有位,取反再加1得到的一个新的二进制码
    4. 负数由补码表示的原因
      //1. 0表示法的统一
      //+0为00000000,而-0如果不用补码表示,为10000000,明显同一个值的表示方法不统一
      //而如果改为补码,-0为00000000取反+1,还是00000000
      //2. 减法可以当做加法运算,cpu中就不用设计减法器了
      //5-3,转为5+(-3),-3用补码表示为11111101,00000101+11111101=100000010,最前面的1溢出,所以结果是2
      
    5. 例如-7,源码应该是10000111,取反后为11111000,加1后为11111001,也就是说在java中,-7是以11111001存在的
    6. 互补对称性:-n=~n+1,也就是说一个数字的二进制码,取反后+1,就是其相反数的二进制码,例如想知道11111001表示的值n,那么-n的二进制码为,对其取反+1,得到00000111,为7,那么-n=7,则n=-7,通常使用该公式计算负数的二进制码代表的值
    7. 对一个二进制码取反后+1,与对该二进制码先-1,再取反,结果是相同的
  4. int类型数的范围:由于int为4字节,也就是32bit位,而二进制第一位表示符号,因此其最大正数为2的31次方-1,最小负数为2的31次方
3.4.2 >>>、>>、<<
  1. 表示按照二进制把数字右移指定位数,右侧低位移除
  2. “>>>”:左侧高位直接补零
  3. “>>”:左侧高位根据原值正负,对高位全补0或1
//00001111(15),右移2位,右侧移除,左侧补0为0000 0011(3)
15>>>2
//10000001(-127),右移2位,右侧移除,左侧都补1为11100000
3.4.3 ||与|、&&与&
  1. 作为逻辑表达式:用于连接两个boolean值
    1. ||与&&拥有短路的功能,比如||左边为true,右侧表达式不会进行,&&左边为假,右边表达式也不会执行
    2. |和&左右两边表达式都会执行
  2. |和&可以作为位运算符:用于连接两个整型值
    1. 会将连接的两个整型值,转为二进制的形式,然后每一位进行比较,对于|,只要有一个为1,就为1,对于&,两边都为1才为1
    2. 8&3:1000&0011=0000
  3. 运算符优先级:!>&&>||
3.4.4 ^、~
  1. ^:异或,相同为0,不同为1,也就是不进位加法
  2. ~:取反,1变为0,0变为1
3.4.5 巧妙使用位运算
  1. 位运算只能用在整型数上,效率要比乘除更快
  2. a>>x:
    1. a为正数:等于a/2的x方,舍弃余数
    2. a为负数:等于a/2的x方,舍弃余数后,-1
  3. a<<x:相当于a*2的x方
  4. a、b两值互换
int a = 3;
int b= 12;
a = a^b;
b = a^b;
a = a^b;
System.out.println(a+"  "+b);
  1. a为正数、x为2的n次方:a%x = a&(x-1)
//1. 假设a为12,x为3,可以这样考虑,12二进制码为00001100,除2的x方,就是右移x位,假设x为3,即00001,100
//2. 前面00001表示12除2的3次方得到的结果,保留整数,为1
//3. 后面100其实就是用二进制表示的12除8后的余数
//4. 那么我可以思考,只想取a/x的n次方后面的余数,我们完全可以使用00001100&00000111,这样前面都被舍弃,只保留后面三位100,这个结果和除2的3次方得到的余数完全相同
//5. 而00000111其实就是8-1,因此12%8=12&(8-1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值