数据类型与运算符

1. 计算机如何存储整数和小数

1.计算机如何存储整数

计算机底层存储的是整数的补码

要知道补码,必须先知道原码,和反码。

用一个字节举例
原码:最高位是符号位(0表示正数,1表示负数),其他位为数值位。
比如:
10的原码: 00001010
-10的原码: 10001010
反码:正整数的反码与原码一致,负整数的反码是在原码基础上,符号位不变,其他位按位取反
10的反码: 00001010
-10的反码:11110101
补码:正整数的补码与原码一致,负整数的补码是在反码基础上加1
10的补码:00001010
-10的补码:11110110
一个字节Byte可以表示的数值范围:
不考虑负数:0000000011111111 : 0255
考虑负数:
0000 0000 ~ 0111 1111 ==> 0~127
1000 0001 ~ 1111 1111 ==> -127 ~ -1 (补码形式存储)
1000 0000 ==> -128 特殊值,最高位既是符号位,又是数值位

2.计算机如何存储小数

使用4个字节举例
最高位是符号位,后八位是指数位,最后是小数尾数位
结论:
计算机中浮点数,不能精确存储小数,实际存储的是一个近似值。
同样位数的二进制存储的浮点数的范围远大于存储整数。

2. 计算机如何存储字符类型

比如如何存储 ‘a’,’中’,计算机借助字符集实现。
字符集:是一个字符与整数之间的对应表。
比如ASCII码表:表中’a’-97 ‘b’-98 ‘0’-48。用一个字节范围内的整数表示字符,
Unicode字符集:全球统一码,万国码。用2个字节范围内的整数表示字符。
Java程序中,字符的表示形式:

1.直接使用单引号表示:

​ ‘a’,’中’,

2.使用转义字符:

​ ‘'‘,”"“,’\r’,’\n’,’\t’

3.使用Unicode的编码值:

​ ‘\u5C1A’

3. Java数据类型分类

1. 按数据类型

无标题

2. 按声明的位置的不同

①在方法体外,类体内声明的变量称为成员变量。
②方法体内部声明的变量称为局部变量。
image-20230121203602456.png
注意:二者在初始化值方面的异同: 同:都有生命周期 异:局部变量除形参外,需显式初始化。

4. 基本数据类型的存储范围

1. 整型系列

① java的整型常量默认为 int 型
② java程序中变量通常声明为int型,除非不足以表示较大的数,才使用long
③ 声明long型常量须后加‘l’或‘L’

(1) byte:字节类型

​ 占内存:1个字节

​ 存储范围:-128~127

1
2
byte b=10;
byte b1=128//编译失败: 不兼容的类型: 从int转换到byte可能会有损失

(2)short:短整型类型

​ 占内存:2个字节

​ 存储范围:-32768~32767

1
2
short s=10;
short s1=32768//编译失败: 不兼容的类型: 从int转换到short可能会有损失

(3)int:整型

​ 占内存:4个字节

​ 存储范围:-2的31次方 ~ 2的31次方-1

1
2
int i=10;
int i1=12345678900;//编译错误: 过大的整数: 12345678900

(4)long:整型

​ 占内存:8个字节

​ 存储范围:-2的63次方 ~ 2的63次方-1

1
2
long j=10;
long j1=12345678900L;

注意:如果要表示某个超过int范围的常量整数它是long类型,那么需要在数字后面加L

2. 浮点型系列(小数)

(1)float:单精度浮点型

占内存:4个字节

精度:可展示小数点后七位,小数点后六位准确,第七位不准确

注意:如果要表示某个常量小数是float类型,那么需要在数字后面加F或f,否则就是double类型

浮点数的表示范围比整型数大是因为采用的表示形式不同。
整型数在计算机底层采用补码的形式表示,除去首位的符号位,剩余的位数即表示数值的范围。浮点数在计算机中则是实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,用以近似表示任意某个实数

(2)double:双精度浮点型

占内存:8个字节

精度:可展示小数点后十六位,小数点后十五位准确,第十六位不准确

1
2
float f = 12.3F;//右边如果赋值小数常量值,那么必须加F或f
double d = 12.3;

整数和浮点数的开发使用范围

3 数字类型开发选择

BigInteger和BigDecimal在常用类与基础API章节才学,先不用管

1.整数
  • Byte:适用于不超过 3 位整数范围的情况。
    • 实际范围:-128 到 127。
    • 最多3位数字(例如,127)。
  • Short:适用于不超过 5 位整数范围的情况。
    • 实际范围:-32,768 到 32,767。
    • 最多5位数字(例如,32,767)。
  • Integer:适用于不超过 10 位整数范围的情况。
    • 实际范围:-2,147,483,648 到 2,147,483,647。
    • 最多10位数字(例如,2,147,483,647)。
  • Long:适用于不超过 19 位整数范围的情况。
    • 实际范围:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
    • 最多19位数字(例如,9,223,372,036,854,775,807)。
  • BigInteger:适用于超过 Long 类型范围的整数。
2.浮点数

有效数字是指从第一个非零数字开始到最后一个非零数字结束的所有数字。例如:
1234567.0 有7位有效数字:1, 2, 3, 4, 5, 6, 7。

  • Float:适用于表示 6 位有效数字的单精度浮点数,第7位不准确
  • Double:适用于表示约 15 位有效数字的双精度浮点数,第16位不准确
  • BigDecimal:适用于需要高精度浮点数运算的场景。
4. 单字符类型:char

占内存:2个字节

1
char ch='a';

char类型:使用单引号’’

① 定义char型变量,通常使用一对’’,内部只能写一个字符
② 表示方式:1.声明一个字符 2.转义字符 3.直接使用 Unicode 值来表示字符型常量

5. 布尔类型

boolean:只能存储true或false

虽然计算机底层使用0和1表示false和true,但是在代码中不能给boolean类型的变量赋值0和1,只能赋值false和true

5. 基本数据类型转换-隐式自动转换

1.涉及到的基本数据类型:除了boolean之外的其他7种
2.自动类型转换(只涉及7种基本数据类型)
结论:当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型。
byte 、char 、short –> int –> long –> float –> double
特别的:当byte、char、short三种类型的变量做运算时,结果为int型
说明:此时的容量大小指的是,表示数的范围的大和小。比如:float容量要大于long的容量

6. 基本数据类型转换-强制类型转换

自动类型提升运算的逆运算。

在后面章节讲

1.需要使用强转符:()
2.注意点:强制类型转换,可能导致精度损失

7. 变量与运算符-String 类的基本使用

  1. String属于引用数据类型,翻译为:字符串
  2. 声明String类型变量时,使用一对””
  3. String可以和8种基本数据类型变量做运算,且运算只能是连接运算:+
  4. 运算的结果仍然是String类型

8. 运算符分类

按照功能划分:

分类 运算符
算术运算符 +-*/%++--
赋值运算符 =+=-=*=/=%=
关系运算符 >>=<<===!=
逻辑运算符 &、`
条件运算符 (条件表达式)?结果1:结果2;
位运算符(了解) &、`

按照操作数个数划分:

分类 运算符 例子
一元(单目)运算符 ++、–、! i++、–i
二元(双目)运算符 +、-、*、/、%、>、<=等 a+b、10>=9
三元(三目)运算符 表达式1?表达式2:表达式3 age>=18?”成年”:”未成年”

9. 算术运算符

算术运算符 符号解释
+ 加法运算,字符串连接运算,正号
- 减法运算,负号
* 乘法运算
/ 除法运算,整数/整数结果还是整数
% 求余运算,余数的符号只看被除数
++ 、 – 自增自减运算

算术运算符: + - + - * / % (前)++ (后)++ (前)– (后)– +

10. 赋值运算符

注意:所有的赋值运算符的=左边一定是一个变量

赋值运算符 符号解释
= 将符号右边的值,赋值给左边的变量
+= 将符号 左边的值 和 右边的值 进行相加操作,最后将结果 赋值给左边的变量
-= 将符号 左边的值 和 右边的值 进行相减操作,最后将结果 赋值给左边的变量
*= 将符号 左边的值 和 右边的值 进行相乘操作,最后将结果 赋值给左边的变量
/= 将符号 左边的值 和 右边的值 进行相除操作,最后将结果 赋值给左边的变量
%= 将符号 左边的值 和 右边的值 进行取余操作,最后将结果 赋值给左边的变量

eg:
short s1 = 10;
//s1 = s1 + 2;//编译失败
s1 += 2;//结论:不会改变变量本身的数据类型

11. 关系运算符

比较运算符,是两个数据之间进行比较的运算,运算结果一定是boolean值true或者false

关系运算符 符号解释
< 比较符号左边的数据是否小于右边的数据,如果小于结果是true。
> 比较符号左边的数据是否大于右边的数据,如果大于结果是true。
<= 比较符号左边的数据是否小于或者等于右边的数据,如果大于结果是false。
>= 比较符号左边的数据是否大于或者等于右边的数据,如果小于结果是false。
== 比较符号两边数据是否相等,相等结果是true。
!= 不等于符号 ,如果符号两边的数据不相等,结果是true。

12. 逻辑运算符

逻辑运算符,是用来连接两个布尔类型结果的运算符(!除外),运算结果一定是boolean值true或者false

逻辑运算符 符号解释 符号特点
& 与,且 有 false 则 false
| 有 true 则 true
^ 异或 相同为 false ,不同为 true
! 非 false 则 true ,非 true 则 false
&& 双与,短路与 左边为false,则右边就不看
|| 双或,短路或 左边为true,则右边就不看

&&和&区别,||和|区别

短路与,短路或运算符左边表达式结果可以确定最终结果,则运算符右边表达式不再进行运算,效率高

  • ** && 和 & **区别:

    && 和 & 结果一样, && 有短路效果,左边为false,右边不执行; & 左边无论是什么,右边都会执行。

  • ** || 和 | **区别:

    || 和 | 结果一样, || 有短路效果,左边为true,右边不执行; | 左边无论是什么,右边都会执行

13. 条件运算符

  • 条件运算符格式:
1
条件表达式?表达式1:表达式2
  • 说明
    ① 条件表达式的结果为boolean类型
    ② 根据条件表达式真或假,决定执行表达式1,还是表达式2.
    如果表达式为true,则执行表达式1。
    如果表达式为false,则执行表达式2。
    ③ 表达式1 和表达式2要求是一致的。
    ④ 三元运算符可以嵌套使用
  • 凡是可以使用三元运算符的地方,都可以改写为if-else
    反之,不成立。
  • 如果程序既可以使用三元运算符,又可以使用if-else结构,那么优先选择三元运算符。原因:简洁、执行效率高。

14. 位运算符(了解)

位运算符 符号解释
& 按位与,当两位相同时为1时才返回1
| 按位或,只要有一位为1即可返回1
~ 按位非,将操作数的每个位(包括符号位)全部取反
^ 按位异或。当两位相同时返回0,不同时返回1
<< 左移运算符
>> 右移运算符
>>> 无符号右移运算符
  • 位运算符操作的都是整型的数据
  • 左移<< : 在一定范围内,每向左移1位,相当于 * 2
  • 右移: >>: 在一定范围内,每向右移1位,相当于 / 2
  • 位运算符的运算过程都是基于补码运算,但是看结果,我们得换成原码,再换成十进制看结果
  • 从二进制到十进制都是基于原码
  • byte,short,char在计算时按照int类型处理
  • 位运算直接对二进制进行位移操作实现数值运算,所以运算效率高

如何区分&,|,^是逻辑运算符还是位运算符?

如果操作数是boolean类型,就是逻辑运算符,如果操作数是整数,那么就是位运算符。