RUST学习日记】第8课 类型转换(下)

简介: RUST学习日记】第8课 类型转换(下)

0x00 回顾


上一篇文章主要介绍了类型转换的一些概念和类型转换的3个原则,这篇文章将继续介绍类型转换的基本原则。


0x02 类型转换规则(Coercion Rule)


接上篇文章


4、浮点数转换为整数时,将会直接舍弃小数位,保留整数部分。另外还有下面3点要注意:

  • 如果浮点数是NAN,转为整数时将会返回0
  • 如果当前的浮点数值大于所转换的整数类型的最大值,则将返回该整数类型的最大值
  • 如果当前的浮点数值小于所转换的整数类型的最大值,则将返回该整数类型的最小值

示例代码:

// NAN 相当于 0.0 / 0.0
    let a: f64 = f64::NAN;
    // 正无穷大 +∞
    let b: f64 = f64::INFINITY;
    // 负无穷大 -∞
    let c: f64 = f64::NEG_INFINITY;
    println!("NAN 转换为整数的值为 {}", a as i32);
    println!("+∞ 转换为整数的值为 {}", b as i32);
    println!("-∞ 转换为整数的值为 {}", c as i32);
    // 其它情况,直接舍弃小数,不会进行四舍五入
    let d: f64 = 54.5;
    let e: f64 = 65.1;
    println!("浮点数 {} 转换为整数 {}", d, d as i32);
    println!("浮点数 {} 转换为整数 {}", e, e as i32);

代码执行结果:

NAN 转换为整数的值为 0
+∞ 转换为整数的值为 2147483647
-∞ 转换为整数的值为 -2147483648
浮点数 54.5 转换为整数 54
浮点数 65.1 转换为整数 65

5、整数转换为浮点数时,可能会发生数据浮动

  • 如果发生数据浮动,将遵循roundTiesToEven模式。(数据round到到相邻最近的浮点数据上。如果两个浮点数据都一样近,则round到最后一位是偶数的浮点数据上)
  • 如果转换时发生溢出,则将会输出为无穷大(∞)

PS:在数值类型中,溢出仅发生在 u128 as f32的值大于或者等于f32::MAX + (0.5 ULP)时。


示例代码:

let a: i32 = 5;
    println!("{} 转为浮点数 {}", a, a as f64);
    // 溢出
    let b: u128 = u128::MAX;
    println!("{} 转为浮点数 {}", b, b as f32);

代码执行结果:

5 转为浮点数 5
340282366920938463463374607431768211455 转为浮点数 inf

6、f32浮点数可以完美无损的转换为f64浮点数。

示例代码:

let a: f32 = 98.0;
    println!("f32浮点数 {} 转为 f64浮点数 {}", a, a as f64);

代码执行结果:

f32浮点数 98 转为 f64浮点数 98

7、f32浮点数转换f64浮点数时,可能会发生数据浮动。

  • 如果发生数据浮动,将遵循roundTiesToEven模式。(数据round到到相邻最近的浮点数据上。如果两个浮点数据都一样近,则round到最后一位是偶数的浮点数据上)
  • 如果转换时发生溢出,则将会输出为无穷大(∞)

示例代码:

// 数据浮动,注意精度
    let a: f64 = 9045.213123;
    println!("f64浮点数 {} 转为 f32浮点数 {}", a, a as f32);
    // 溢出
    let b: f64 = f64::MAX;
    println!("f64浮点数 {} 转为 f32浮点数 {}", b, b as f32);

代码执行结果:

f64浮点数 9045.213123 转为 f32浮点数 9045.213
f64浮点数 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 转为 f32浮点数 inf

8、布尔型转为整数型。true转为整数的值是1false转为整数的值是0。Rust不允许由整数转为布尔型

示例代码:

let a = false;
    let b = true;
    println!("{} 转为 整数为 {}", a, a as i32);
    println!("{} 转为 整数为 {}", b, b as i32);

代码执行结果:

false 转为 整数为 0
true 转为 整数为 1

9、u8类型转换为char类型

  • 仅支持u8型整数转为char类型
  • char类型转为整数时,如果整数位数长度不够,则将发生截断,同上面说的第3点

示例代码:

// u8转为char
    let a: u8 = 97;
    println!("u8型整数 {} 转为 char 为{}", a, a as char);
    // char转整数
    // 笑脸图标
    let b: char = '\u{1F604}';
    println!("char型 {} 转为i32的值为:{}, 其二进制为 {:032b}", b, b as i32, b as i32);
    println!("char型 {} 转为i16的值为:{}, 其二进制为 {:032b}", b, b as i16, b as i16);
    println!("char型 {} 转为i8的值为:{}, 其二进制为 {:032b}", b, b as i8, b as i8);

代码执行结果:

u8型整数 97 转为 char 为a
char型 😄 转为i32的值为:128516, 其二进制为 00000000000000011111011000000100
char型 😄 转为i16的值为:-2556, 其二进制为 00000000000000001111011000000100
char型 😄 转为i8的值为:4, 其二进制为 00000000000000000000000000000100


0x03 小结


我花费一篇文章来讲了Rust中的数值间的类型转换,希望对大家有所帮助。当然as并不是仅可以应用于数值间的强制类型转换,还有如枚举,指针等等。其它类型的转换后续章节将会介绍。写到这里已经达到3000字了,由于篇幅问题,文章中并没有讲浮点数是如何转为二进制存储的,如果有感兴趣的同学可以查阅下资料。


0x04 参考资料


Rust 类型转换官方文档:https://doc.rust-lang.org/reference/expressions/operator-expr.html#type-cast-expressions


Unicode所有区段 统一码编码范围 | Unicode符号库 :https://fuhaoku.net/blocks

相关文章
|
存储 Rust 网络协议
【Rust学习】10_定义枚举
在这一章我们学习 枚举(enumerations),也被称作 enums。枚举允许你通过列举可能的 成员(variants) 来定义一个类型。首先,我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下来,我们会探索一个特别有用的枚举,叫做 Option,它代表一个值要么是某个值要么什么都不是。然后会讲到在 match 表达式中用模式匹配,针对不同的枚举值编写相应要执行的代码。最后,我们将学习 if let 结构,另一个简洁方便处理代码中枚举的结构。
190 7
|
Rust 算法 安全
学习Rust
【10月更文挑战第13天】学习Rust
236 8
|
Rust 安全 算法
Rust的学习
【10月更文挑战第12天】Rust的学习
235 2
|
Rust 算法 安全
如何学习Rust编程?
【10月更文挑战第12天】如何学习Rust编程?
238 1
|
Rust 索引
【Rust学习】08_使用结构体代码示例
为了了解我们何时可能想要使用结构体,让我们编写一个计算长方形面积的程序。我们将从使用单个变量开始,然后重构程序,直到我们改用结构体。
218 2
|
存储 Rust 编译器
【Rust学习】07_结构体说明
**struct**或 ***structure***是一种自定义数据类型,允许您命名和包装多个相关的值,从而形成一个有意义的组合。如果您熟悉面向对象的语言,那么**struct**就像对象中的数据属性。在本章中,我们将比较和对比元组与结构体,在您已经知道的基础上,来演示结构体是对数据进行分组的更好方法。
151 1
|
Rust API
【Rust学习】09_方法语法
结构体让你可以创建出在你的领域中有意义的自定义类型。通过结构体,我们可以将相关联的数据片段联系起来并命名它们,这样可以使得代码更加清晰。在 impl 块中,你可以定义与你的类型相关联的函数,而方法是一种相关联的函数,允许您指定结构体的实例具有的行为。 但是结构体并不是创建自定义类型的唯一方式:让我们转向 Rust 的 enum 功能,将另一个工具添加到你的工具箱中。
122 0
|
存储 Rust 安全
【Rust学习】06_切片
所有权、借用和切片的概念确保了 Rust 程序在编译时的内存安全。Rust 语言提供了跟其他系统编程语言相同的方式来控制你使用的内存,但拥有数据所有者在离开作用域后自动清除其数据的功能意味着你无须额外编写和调试相关的控制代码。
148 1
|
Rust Linux Go
Rust/Go语言学习
Rust/Go语言学习
|
Rust 编译器
【Rust学习】05_引用和借用
在这章我们将开始学习Rust的引用和借用,它们是Rust中重要的概念,它们允许我们创建可变引用,以及创建不可变引用。
168 0