JavaSE — 数据类型和运算符
一、数据类型
二、整型
1、原码、反码、补码
> 整型 5 和 -5 用二进制原码、反码、补码表示,其实默认为`int`,占4个字节,32位
>
> 注意:`补码`才是计算机底层保存整数的的类型
-
原码:
5 : 0000 0101
-5: 1000 0101
-
反码:
5 :0000 0101(正数原码、反码和补码一样)
-5:1111 1010(原码取反,最高位的符号位不变)
-
补码
5 :0000 0101
-5:1111 1011(反码加1)
2、为什么计算机用补码计算
- 最大的好处就是可以将加法和减法统一进行计算
- 例如正整数 5 加上它的相反数结果为 0,5二进制表示为 0000 0101,需要找一个和它相加为 0 的二进制数,即 1111 1111 + 1 = 0(位数溢出,结果为 0000 0000),也就是说 1111 1011就是我们需要的,而这个数就是 -5 的
反码
+1
,这也是为什么负数的补码需要反码加1
三、字符型
java 使用 Unicode 字符集作为编码方式
- 计算机底层保存字符时,实际是保存该字符对应的编号,因此,
char
类型的值也可以直接作为整型值来使用,相当于一个16位的无符号整数,范围 0~65535 - 如果把0~65535范围内的一个 int 值赋给 char 类型,系统会自动当成 char 类型处理
四、浮点型
1、浮点数计算精度丢失问题
- 原因:二进制不能完全准确的表示浮点数
2、二进制为什么不能准确的表示浮点数
-
二进制表示小数点后面位数时,只有 2 的多少次方
2的次方 十进制 2^(-1) 0.5 2^(-2) 0.25 2^(-3) 0.125 2^(-4) 0.625 不难看出,2的某次方之和可以精确表示,其他数则不行
3、代码中怎么解决精度丢失问题
- 使用 BigDecimal 进行运算
- 注意:应先将参数转为String,不然会默认 double 类型,在进行转换 double类型时,会造成精度丢失
五、基本类型的类型转换
1、自动类型转换
-
将某种基本类型的值赋给更大的类型时,会自动转换成大的类型,大小如下
2、强制类型转换
-
上图右边类型向左转换时,必须进行强转,例如下图所示
六、运算符
注意:当
/
、%
运算,有一个或者两个操作数为浮点数时,第二个操作数可以为0,系统当作小数处理,/
结果为无穷大或负无穷大,%
结果为非数 NaN
/
取整,如 13 / 3 = 4%
取余,如 13 % 3 = 1
1、位运算符
&
:按位与,两位同时为1,返回1|
:按位或,只要有一位是1,返回1~
:按位非,全部取反,包括符号位^
:按位异或,两位相同返回0,不同返回1<<
:左移运算符>>
:右移运算符>>>
:无符号右移运算符
2、左移运算符和右移运算符
<<
左移运算符,左移后右边空出的位以0补充,左边超出部分截取掉>>
右移运算符,左边空出位数按原来符号补充,即正数补0,负数补1>>>
无符号右移运算,左边补0
3、移位运算注意
- 低于
int
的类型(byte
、short
和char
)的操作数,会先自动转转换成int
类型再移位 - 对于
int
类型的整数移位 a >> b,当 b>32时,系统会先用 b 对32求余,得到的余数才是真正的移位,因为int
只有32位,也就是说 a >> 34 和 a >> 2 结果一样 - 对于
long
类型的整数移位 c >> d,和int
一样,只不过是先将 d 对 64取余
4、逻辑运算符
&&
:短路与,前后两个操作数都为 true,则返回 true&
:与,和短路与一样,只是不会短路||
:短路或,前后两个操作数一个为 true,则返回 true|
:或,和短路或一样,只是不会短路!
:非,去取反,如 true,取 false^
:异或,两个操作数不同才返回 true,否则返回 false