11.类型和运算
11.1进制
对于任何一种进制---X进制,就表示某一位置上的数运算时是逢X进一位后自己归0。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。
计算机中的进制:
- 二进制:由两个基本数字0,1组成,运算规律是逢二进一。计算机都使用二进制存储数据.
- 八进制:由0、1、2、3、4、5、6、7组成,运算规律是逢八进一.
- 十进制:由0,1,2、3、4、5、6、7、8、9组成.
- 十六进制:由0~9以及A,B,C,D,E,F组成.
二进制数系统中,位简记为b,也称为比特,位是数据存储的最小单位.
每个二进制数字0或1就是一个位(bit)。其中8 bit 就称为一个字节(Byte)
- 1B(byte,字节)= 8 bit;
- 1KB(Kibibyte,千字节)= 1024B;
- 1MB(Mebibyte,兆字节,百万字节,简称“兆”)=1024KB;
- 1GB(Gigabyte,吉字节,十亿字节,又称“千兆”)=1024MB;
- 1TB(Terabyte,万亿字节,太字节)=1024GB;
进制的转换:
-
十进制和X进制之间转换:
十进制--->八进制/十六进制/X进制
十进制转X进制,使用倒除法,让被除数每次都除以X,所得的商如果大于了X,那继续除,并且记录好每次所除留下来的余数,然后把最后留下的商和余数的反写拼在一起就是结果
-
X进制和十进制之间转换
八进制/十六进制/X进制 ---> 十进制:
X进制转十进制,把这个X进制数从末位开始分别乘以X的n-1次方(n表示第几个数位),所得的权再相加
11.2 原码 反码 补码###
在计算机内,有符号数有3种表示法:原码、反码和补码
所有数据的运算都是采用补码进行的,存储也是用补码
-
原码
最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小
-
反码
正数的反码与原码一样
负数的反码是对其原码逐位取反,但符号位除外。
-
补码
正数的补码与原码一样
负数的补码是在其反码的末位加1。
例子:
+3(0000 0011)
原码,反码,补码都是0000 0011
-3(1000 0011)
原码:1000 0011 反码:1111 1100 补码:1111 1101
11.3 常量和变量
-
常量
常量分类:
-
字面量/直接量:一个写死的固定不变的值,如整数1/2/3/110等等。小数3.14。布尔常量true/false等
-
final修饰的变量
-
-
变量
-
变量的特点:
-
占据着内存中的某一块存储区域;
-
该区域有自己的名称(变量名)和类型(数据类型);
-
可以被重复使用;
-
该区域的数据可以在同一类型范围内不断变化;
-
-
定义变量的语法:
-
先定义变量,再赋值:
数据类型 变量名;
变量名 = 值;
-
或在声明时同时赋值:
数据类型 变量名 = 初始化值;
-
-
11.4 数据类型
分类
-
基本数据类型,又称为原生数据类型;
-
整数型: byte、short、int 、long
-
浮点数型:float、double
-
字符型: char
-
布尔型: boolean
-
- 引用数据类型,又称为对象数据类型,包括类,接口,数组等;
基本数据类型
-
布尔型boolean
1位, 该类型的值只能是true 或 false,表示真或假。
-
整数类型
类型 占位(字节) 范围 byte 1 [-128 ~ 127] short 2 [-32768 ~ 32767] int 4 [-21E ~ 21E] long 8 [-9*10^18 ~ 9 *10^18]
-
一个整型的字面量默认是int类型.
-
声明long型变量后加上‘l’或‘L’,因小写的l容易和数字1相混淆,建议使用大写L。
-
-
浮点型
类型 占位(字节) 范围
float 4 [-3.4E38 ~ 3.4E38]
double 8 [-1.7E308 ~ 1.7E38]
- float表示单精度类型,double表示双精度类型,但是二者都不能表示精确的小数。
- Java的浮点类型常量有两种表现形式:
- 十进制形式: 例如:3.14 ,168.0, 0.618
- 科学计数法形式: 例如:3.14e2, 3.14E2, 1000E-2
- 科学计数法表达式返回的结果是double类型。
- 一个浮点类型的字面量默认是double类型
- 若要声明一个常量为float型,则需在常量后加上f 或 F,double常量后面的D或d可省略。
- 注意:Java里只有浮点型的变量才可以接受科学计算式结果
-
字符型
-
char类型,只能存储1个字符,使用的是16位的无符号整数或者Unicode字符,Java对字符采用Unicode字符编码
-
Unicode是一种跨平台的编码方式,Java的字符占两个字节,可以表示一个汉字。
char常量的主要表示形式:
-
直接使用单个字符来指定字符常量,格式如'◆'、'A','7';
-
直接作为整数类型使用,但是数据范围在[0,65535],格式如97,但是打印出来的值依然是ASCII码表对应的图,如97打印出来是字符a。
-
转义字符
\ 就是转义字符
-
将普通字符转为特殊用途,一般是编程语言中,用于表示不能直接显示的字符。
tab建 --> \t 换行 --> \n
-
用来将特殊意义的字符转换回它原来的意义。
双引号("),单引号('),反斜线(\)
类型转换
-
boolean不属于数值类型,不参与转换.
-
short与char不能相互转换
-
自动类型转换
也称为“隐式类型转换"
-
当把小数据范围类型的数值或变量赋给另一个大数据范围类型变量,系统可以完成自动类型转型。
-
当常量值在变量范围内,会自动转换, byte b1 = 100;
-
-
强制类型转换
也称为“显示类型转换"
-
当把大范围类型的数值或变量赋给另一个小范围类型变量时,此时系统不能自动完成转换,需要加上强制转换符
-
可能造成数据精度的降低或溢出,所以使用时要格外注意。
byte a = (byte)128; //输出 a 的值为 -128 原因: 128 默认是int型 0000 00000 0000 0000 0000 0000 1000 0000 以int类型计算十进制值为128 强制转换成byte类型后 1000 0000 此时以byte类型计算十进制值为-128
-
-
表达式类型的自动提升
当一个算术表达式中包含多个基本数据类型(boolean除外)的值时,整个算术表达式的数据类型将在数据运算时出现类型自动提升
提升规则:
-
所有的byte、short、char类型被自动提升到int类型;
-
整个表达式的最终结果类型被提升到表达式中类型最高的类型;
基本类型中只要看到了double参与运算,结果一定是double
-
11.5 Java运算符
-
算术运算符
-
加号:在操作数值、字符、字符串时其结果是不同的
-
当两个字符相加得到的是ASCII码表值,
-
当两个字符串相加时表示将两个字符串连接在一起,从而组成新的字符串。
-
-
除号:整数在使用除号操作时,得到的结果仍为整数(小数部分忽略),当整数除以0的时候,会引发算术异常。
正无穷大(Infinity):正整数除以0.0时; 负无穷大(-Infinity):负整数除以0.0时; NaN(Not a Number):当0.0除以0.0时,浮点数或整数%0.0
-
取模:模数的符号忽略不计,结果的正负取决于被模数.
5 % -2 输出1
-
无穷大和NaN都属于double浮点类型,但是所有正无穷大都是相等的,所有负无穷大也是相等的,NaN永远不相等,也不等于自己.
-
数据溢出问题:
int max = 2147483647; int min = -2147483648; max + 1 输出-2147483648 min - 1 输出2147483647
-
自增:++,递增操作符,使变量值增加1,有前置和后置之分,只能操作变量。
唯一的区别是:
-
前置(++result): result+1 之后再输出值
-
后置(result++): 先输出值,再result+1。
如果仅仅执行简单的递增操作(只写result++或++result),那么选用任意一个都可以。
-
-
自减: -- ,递减操作符,使变量值减去1,有前置和后置之分,只能操作变量。
-
-
赋值运算符
专门为变量指定值或重新指定值
= 赋值 += -= *= /= %=
-
比较运算符
==:等于,若比较的是两个操作数都是数值类型,即使他们的类型不同,只要值相同就返回true。 != < > <= >= instanceof 检查是否是类的对象
-
三元运算符
语法格式:X ? Y :Z,
其中x为boolean类型表达式,先计算X的值,若X结果为true则整个三目运算表达式的结果是Y,否则就是Z
-
逻辑运算符
用于操作两个boolean类型的变量或常量,结果类型也是boolean。
&: 表示并且,当操作数A和B都为true结果才为true,否则结果result 是false。 &&: 和&结果相同,具有短路效果,如果左边操作数A是false,result 一定为false,且不运行B的运算。 |: 表示或者,A和B都为false结果result为false,只要有A或B是true,结果就是true。 ||: 和|结果相同,具有短路效果,如果左边操作数A是true,result一定为true,且不运行B的运算。 ^: 判断A和B是否不同,不同则为true,相同则为false。 !: 取反,!true结果是false,!fasle结果是true。
-
位运算符
遵循规则:1相当于true,0相当于false
&:参与运算的两个数,若相应位数的值都为1,则该位结果值是1,否则是0。
|:参与运算的两个数相应位中只要有一个1,结果就是1。
^:参与运算的两个数相应位相同则结果为0,否则为1。
~ :表示把每个二进制位的“1”换成“0”,把“0”换成“1”。
<< : 左移位
>> : 右移位 补位是使用源数据的最高位来补
>>> : 无符号右移位 补位都用0来补,不管最高位是什么
示例代码:
//0b开头表示二进制数, _是用来区分位数 int num1 = 0b0000_0000_0000_0000_0000_0000_0000_0101 //5 int num2 = 0b0000_0000_0000_0000_0000_0000_0000_0011 //3 num1 & num2 //...0000_0001 ->1 num1 | num2 //...0000_0111 ->7 num1 ^ num2 //...0000_0110 ->6 ~num2 //取反后:0b1111_1111_1111_1111_1111_1111_1111_1100 为负数 负数则需要取补码来计算,补码为...0000_0100 ->4 num2 << 2 //0b0000_0000_0000_0000_0000_0000_0000_1100 ->12 num1 >> 2 //0b0000_0000_0000_0000_0000_0000_0000_0001 -num1 //11111111111111111111111111111011 -->计算出来的是-3的补码 -num1 >> 2 //补位都用0: 00111111111111111111111111111110 ->1073741822 -num1 >>> 2 //补位用最高位: 11111111111111111111111111111110 ->负数用补码计算:-2
网友评论