03-基础语法2
【基本数据类型】对于每一种数据都定义了明确的具体数据类型(强类型语言),在内存中分配了不同大小的内存空间。
1. 整型变量/常量#
整型用于表示没有小数部分的数值,它允许是负数。整型的范围与运行 Java 代码的机器无关,这正是 Java 程序具有很强移植能力的原因之一。与此相反,C 和 C++ 程序需要针对不同的处理器选择最有效的整型。
为什么在初始化 long 类型变量的时候 ,值的末尾要加上 L?
- Java语言的整型常数默认为int型
- 当定义的变量类型是 byte/short 时,赋值的时候会自动检查该整型常量是否在声明的类型的取值范围内:如果在,就会自动类型转换;如果不在,就会报错(在编译期)
- 当声明的变量类型是 long 时,还是那句话:整数默认是 int 类型的;虽然你声明的变量是 long 类型,但是你后边的那个数值默认就是 int 型。所以,当编译的时候,会因为数值超过 int 类型的范围而报错 (long 无法自动强转为 int,怕精度丢失)。
- 故long型变量初始化时,值末尾必须添加 "l" / "L"
2. 浮点型变量/常量#
带小数的数据在Java中称为浮点型。浮点型可分为 float 类型和 double 类型:
- float
- float 类型又被称作单精度类型,尾数可以精确到 7 位有效数字,在很多情况下,float 类型的精度很难满足需求。
- 浮点型常量默认类型也是 double,float 类型赋值时需要添加后缀 F/f。
- float 类型的数值有一个后缀 F 或者 f ,没有后缀 F/f 的浮点数值默认为 double 类型(与上面同理)。
- double
- double 表示这种类型的数值精度约是 float 类型的两倍,又被称作双精度类型。
- 浮点型常量默认类型是 double,也可以在浮点数值后添加后缀 D 或者 d, 以明确其为 double 类型。
Java 浮点类型常量有两种表示形式:
Tip1:为什么 int 和 float 类型都占有 4 个字节,但是 float 类型表示范围却比 int 类型大好多?
摘自:https://blog.csdn.net/C2681595858/article/details/84865920
Tip2:浮点数存在舍入误差,数字不能精确表示
- 运行以下两个示例,发现示例 1 的结果是 " false ",而示例 2 的输出结果是 " d1 == d2 " 。这是因为由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。 浮点数一般都存在舍入误差,很多数字无法精确表示(例如 0.1),其结果只能是接近, 但不等于。二进制浮点数不能精确的表示 0.1、0.01、0.001 这样 10 的负次幂。并不是所有的小数都能可以精确的用二进制浮点数表示。
- 如果需要进行不产生舍入误差的精确数字计算,需要使用 java.math 包下面的两个有用的类:BigInteger 和 BigDecimal,这两个类可以处理任意长度的数值 // BigInteger 实现了任意精度的整数运算,BigDecimal 实现了任意精度的浮点运算。
3. 字符型变量/常量#
字符型在内存中占 2 个字节,在 Java 中使用「单引号」来表示字符常量。
注意! 'a' 是一个字符,它与 "a" 是不同的,"a" 表示含有一个字符的字符串
- 允许使用转义字符 ' \ ' 来将其后的字符转变为其它的含义
- 转义字符
- 字符型的十六进制值表示方法
- char 类型用来表示在 Unicode 编码表中的字符
- Unicode 编码被设计用来处理各种语言的文字,它占 2 个字节,可允许有 65536 个字符
- Unicode 具有从 0 到 65535 之间的编码,他们通常用从 '\u0000' 到 '\uFFFF' 之间的十六进制值来表示(前缀为 u 表示 Unicode)
这也就是为啥 char 类型可以参加算术运算~它将其编码转成一个 int 类型数值参与运算;同理,也可以这么给 char 类型变量赋值。
4. 布尔类型变量/常量#
- boolean 类型有两个常量值:true 和 false,在内存中占一位 (不是 1 个字节)。注意!不可以使用 0 或 !0 的整数替代 true 和 false,这点和 C 语言不同。
- boolean 类型用来判断逻辑条件,一般用于程序流程控制
类型转换#
5. 类型转换#
5.1 自动类型转换#
[自动类型转换] 指的是 {容量小的数据类型} 可以自动转换为 {容量大的数据类型}
[容量大小] 指的是 数据类型所表示的数据范围的大和小 !而不是说它所占用的内存空间的大小
- 数据类型按容量大小排序(当有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算)
- 测试
- 可以将整型常量直接赋值给 byte、 short、 char 等类型变量,而不需要进行强制类型转换,只要不超出其表数范围即可 // 整型变量赋给这仨就算不超范围也会报错~ 详见下面的小问题
- 容量大小:float(4) > long(8)
- Tips
- boolean 类型不能与其它数据类型运算
- byte, short, char 之间不会相互转换,他们三者在计算时首先转换为 int 类型 (包括本类型之间做运算)
- 当把任何基本数据类型的值和字符串(String)进行连接运算时(+),基本数据类型的值将自动转化为字符串(String)类型
- 小问题
5.2 强制类型转换#
自动类型提升运算的逆运算,用于显式的转换一个数值的类型。在有可能丢失信息的情况下进行的转换是通过强转来完成的,但可能造成精度降低或溢出。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?