数据存储和运算符
1.进制
1.1进制的分类
十进制 | 二进制 | 八进制 | 十六进制 | |
---|---|---|---|---|
数字范围 | 0-9 | 0-1 | 0-7 | 0-9,a-f |
进位规则 | 逢十进一 | 逢二进一 | 逢八进一 | 逢十六进一 |
示例 | 125 | 0111 | 175 | 7F |
说明 | 每三位二进制是一位八进制值 | 每四位二进制是一位十六进制值 |
1.2在代码中如何表示四种进制的常量值
- 十进制:正常表示
- 二进制:0b或0B开头
- 八进制:0开头
- 十六进制:0x或0X开头
2.计算机存储单位
- **字节(Byte):**是计算机信息技术用于计量存储容量的一种计量单位,一字节等于八位。
- **位(bit):**是数据存储的最小单位,也就是二进制。二进制数系统中,每个0或1就是一个位,叫做bit(比特),其中8bit就称为一个字节(Byte)。
- 转换关系
8 bit = 1 Byte
1024 Byte = 1KB
1024 KB = 1MB
1024 MB = 1GB
1024 GB = 1TB - float:单精度浮点型,占内存:4个字节,精度:科学计数法的小数点后6~7位。
- double:双精度浮点型,占内存:8个字节,精度:科学计数法的小数点后15~16位。
3.计算机如何表示数据
3.1原码、反码、补码与符号位概念
计算机数据的存储使用二进制补码形式存储,并且最高位是符号位,最高位1是负数,最高位是0为正数。
规定:
- 正数的补码与反码、原码一样,称为三码合一;
- 负数的补码与反码、原码不一样;
- 负数的原码:把十进制转为二进制,然后最高位设置为1
- 负数的反码:在原码的基础上,最高位不变,其余位取反
- 负数的补码:反码+1
3.2如何表示小数?
- 为什么float(4个字节)比long(8个字节)的存储范围大?
- 为什么float和double不精确?
- 为什么double(8个字节)比float(4个字节)精度范围大?
因为float、double底层也是二进制,先把小数转为二进制,然后把二进制表示为科学计数法,然后只保存:①符号位②指数位(需要移位)③尾数位 - 浮点数的二进制
float类型小数:8.25
8.25的二进制:1000.01
1000.01转为科学计数法:1.00001*2的3次,小数点往左移动3位
符号位0,指数位3+127(偏移量)=130转为二进制为10000010,尾数00001,低位补0。 - 0 10000010 00001000000000000000000 原码
- 0 10000010 00001000000000000000000 反码
- 0 10000010 00001000000000000000000 补码
3.3一个字符到底占几个字节?
在JVM中,一个字符占2个字节,Java使用Unicode字符集来表示每一个字符,即每一个字符对应一个唯一的Unicode编码值。char类型的数值参与算术运算或比较大小时,都是用编码值进行计算的。
在文件中保存或网络中传输时文本数据时,和环境编码有关。如果环境编码选择ISO8859-1(又名Latin),那么一个字符占一个字节;如果环境编码选择GBK,那么一个字符占1个或2个字节;如果环境编码选择UTF-8,那么一个字符占1-4个字节。
4.基本数据类型转换
4.1自动类型转换(隐式类型转换)
自动转换:将取值范围小的类型自动提升为取值范围大的类型。
转换规则:
- 当把存储范围小的值(常量值、变量的值、表达式计算的结果值)赋值给存储范围大的变量时。
- 当存储范围小的数据类型与存储范围大的数据类型一起混合运算时,会按照其中最大的类型运算。
- 当byte、short、char数据类型进行算术运算时,按照int类型处理。
4.2强制类型转换(显式类型转换)
强制类型转换:将取值范围大的类型强制转换成取值范围小的类型。
比较而言,自动转换是Java自动执行的,而强制转换是需要我们自己手动执行。
转换格式
数据类型 变量名 = (数据类型)被强转数据值
转换规则
- 当把存储范围大的值(常量值,变量的值,表达式计算的结果值)赋值给了存储范围小的变量时,需要强制类型转换,提示:有风险,可能会损失精度或溢出
- 当把某个值想要提升数据类型时,也可以使用强制类型转换
4.3逻辑运算符
逻辑运算符:用来连接两个布尔类型值的运算符(!除外),运算结果也是boolean值true或者false。
注意:&&和&的区别,||和|区别
- &&和&的区别:&&有短路效果,左边为false,右边不执行;&左边无论是什么,右边都会执行。
- ||和|的区别:||有短路效果,左边为true,右边不执行;|左边无论是什么,右边都会执行。
4.4位运算符
位运算符 | 符号解释 |
---|---|
& | 按位与,当两位相同为1时才返回1 |
| | 按位或,只要有一位为1即可返回1 |
~ | 按位非,将操作数的每个位(包括符号位)全部取反 |
^ | 按位异或。当两位相同时返回0,不同时返回1 |
<< | 左移运算符 |
>> | 右移运算符 |
>>> | 无符号右移运算符 |
- 位运算符的运算过程都是基于补码运算,但是看结果,我们得换成原码,再换成十进制看结果。
- 从二进制到十进制都是基于原码。
- 正数的原码反码补码都一样,负数原码反码补码不一样
- byte,short,char在计算时按照int类型处理
如何区分&,|,^是逻辑运算符还是位运算符?
如果操作数是boolean类型,就是逻辑运算符,如果操作数是正数,那么就是位运算符。
4.4.1左移<<
- 运算规则:左移几位就相当于乘以2的几次方
- 注意:当左移的位数n超过该数据类型的总位数时,相当于左移(n-总位数)位
4.4.2右移>>
- 快速运算:类似于除以2的n次,如果不能整除,向下取整。
4.4.3无符号右移>>>
- 运算规则:往右移动后,左边空出来的位直接补0,不看符号位
- 正数:和右移一样.
- 负数:右边移出去几位,左边补几个0,结果变为正数.
4.4.4运算符优先级
口诀:
单目运算排第一;
乘除余二加减三;
移位四,关系五;
等和不等排第六;
位与,异或和位或;短路与和短路或;
依次从七到十一;
条件排在第十二;
赋值一定是最后.