【Rust】数据类型

embedded/2025/1/15 3:49:34/

目录

 思维导图

1. 数据类型概述

1.1 标量类型

1.1.1 整数类型

1.1.2 浮点数类型

1.1.3 布尔类型

1.1.4 字符类型

1.2 复合类型

1.2.1 元组类型

1.2.2 数组类型

2. 类型注解与类型推断

3. 整数溢出处理

4. 数字运算

5. 示例


思维导图

1. 数据类型概述

Rust是一种静态类型语言,所有变量的类型在编译时必须明确。Rust支持两种主要的数据类型:标量类型和复合类型。

1.1 标量类型

标量类型表示单一值,Rust的四种主要标量类型包括:

  • 整数(Integer)
  • 浮点数(Floating-point)
  • 布尔值(Boolean)
  • 字符(Character)
1.1.1 整数类型
  • 整数类型是没有小数部分的数字,Rust提供了多种整数类型,包括有符号和无符号的8位、16位、32位、64位和128位整数。
  • 例如,u32表示一个无符号32位整数,范围从0到4294967295。
  • 整数的类型可以通过在数字后添加后缀来指定,如57u8表示8位无符号整数。
  • isize 和 usize 类型取决于程序运行的计算机架构,表格中用“arch”表示:如果是在 64 位架构上,则为 64 位;如果是在 32 位架构上,则为 32 位。
整数类型
LengthSignedUnsigned
8-biti8u8
16-biti16u16
32-biti32u32
64-biti64u64
128-biti128u128
archisizeusize

Rust特殊的编写字面量:

整数字面量
Number literalsExample
Decimal98_222
Hex0xff
Octal0o77
Binary0b1111_0000
Byte (u8 Only)b'A'
1.1.2 浮点数类型
  • Rust有两种浮点数类型:f32f64,分别表示32位和64位的浮点数。
  • 默认情况下,Rust使用f64,因为它在现代CPU上与f32的速度相近,但精度更高。
1.1.3 布尔类型
  • 布尔类型只有两个值:truefalse,在Rust中用bool表示。
1.1.4 字符类型
  • Rust的字符类型用char表示,支持Unicode标量值,可以表示多种语言的字符和符号。
  • 字符使用单引号表示,如'z''?'

1.2 复合类型

复合类型可以将多个值组合成一个类型,Rust的两种基本复合类型是元组(Tuple)和数组(Array)。

1.2.1 元组类型
  • 元组是将多个不同类型的值组合在一起的固定长度的集合。
  • 创建元组的语法为使用括号包裹的逗号分隔的值,例如let tup: (i32, f64, u8) = (500, 6.4, 1);
  • 元组的元素可以通过模式匹配进行解构。
1.2.2 数组类型
  • 数组是一种固定长度的集合,所有元素必须是同一类型。
  • 数组的定义方式为使用方括号包裹的逗号分隔的值,例如let a = [1, 2, 3, 4, 5];
  • 数组的类型可以通过指定元素类型和长度来定义,如let a: [i32; 5] = [1, 2, 3, 4, 5];
  • 数组的元素可以通过索引访问,例如let first = a[0];
  • 如果尝试访问超出数组范围的索引,Rust会在运行时崩溃并提示错误。

2. 类型注解与类型推断

Rust的编译器通常能够根据变量的值和使用方式推断出类型,但在某些情况下,例如从字符串转换为数字时,需要显式添加类型注解。示例代码如下:

let guess: u32 = "42".parse().expect("Not a number!");[14]

如果未提供类型注解,编译器会提示需要更多信息。

3. 整数溢出处理

  • Rust在调试模式下会检查整数溢出,导致程序在运行时崩溃。
  • 在发布模式下,Rust会进行二进制补码包装,超出范围的值会“回绕”到最小值。

4. 数字运算

Rust支持基本的数学运算,包括加、减、乘、除和取余。示例代码展示了如何在let语句中使用这些运算:

let sum = 5 + 10;
let difference = 95.5 - 4.3;
let product = 4 * 30;
let quotient = 56.7 / 32.2;
let remainder = 43 % 5;

5. 示例

  1. 类型注解示例

    fn main() {let guess: u32 = "42".parse().expect("Not a number!");
    }
    

    该示例展示了如何使用类型注解来指定变量guess的类型为u32

  2. 整数类型示例

    fn main() {let x: (i32, f64, u8) = (500, 6.4, 1);
    }
    

    这里定义了一个元组x,包含不同类型的整数和浮点数。

  3. 浮点数示例

    fn main() {let x = 2.0; // f64let y: f32 = 3.0; // f32
    }
    

    该示例展示了如何声明浮点数变量,默认类型为f64

  4. 布尔类型示例

    fn main() {let t = true;let f: bool = false; // with explicit type annotation
    }
    

    该示例展示了布尔类型的使用,布尔值可以是truefalse

  5. 字符类型示例

    fn main() {let c = 'z';let z: char = 'ℤ'; // with explicit type annotationlet heart_eyed_cat = '😻';
    }
    

    这里展示了如何声明字符类型的变量,Rust的字符类型支持Unicode。

  6. 数组示例

    fn main() {let a = [1, 2, 3, 4, 5];
    }
    

    该示例展示了如何定义一个包含多个整数的数组。

  7. 访问数组元素示例

    fn main() {let a = [1, 2, 3, 4, 5];let first = a[0];let second = a[1];
    }
    

    这里展示了如何通过索引访问数组中的元素。

  8. 无效数组元素访问示例

    use std::io;
    fn main() {let a = [1, 2, 3, 4, 5];println!("Please enter an array index.");let mut index = String::new();io::stdin().read_line(&mut index).expect("Failed to read line");let index: usize = index.trim().parse().expect("Index entered was not a number");let element = a[index];println!("The value of the element at index {index} is: {element}");
    }
    

    此代码编译成功。如果使用cargo run运行此代码并输入01234,程序将打印出数组中该索引处的对应值。如果输入超出数组末尾的数字,例如10,您将看到如下输出:

    thread 'main' panicked at src/main.rs:19:19:
    index out of bounds: the len is 5 but the index is 10
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

    程序在使用无效值进行索引操作时导致了运行时错误。程序以错误信息退出,并未执行最后的println!语句。

  9. 注意:当你尝试使用索引访问元素时,Rust 会检查你指定的索引是否小于数组长度。如果索引大于或等于长度,Rust 程序就会崩溃。因此,这种检查必须在运行时进行,尤其是在这种情况下,因为编译器无法预先知道用户稍后运行代码时会输入什么值。这是Rust的一个内存安全原则:当用户提供错误的索引时,可能会访问到无效的内存。Rust 通过立即退出而不是允许内存访问并继续运行来保护你免受此类错误的影响。


http://www.ppmy.cn/embedded/154012.html

相关文章

【嵌入式常识篇】一个C项目工程在IDE中是怎么一步步编译成一个固件包的

前言:初学C语言的时候是在Linux环境下,那时候只知道需要通过GCC工具编译成可执行文件才可以在运行,后来进入到了嵌入式行业发现需要IDE将一个C项目工程编译成一个固件包,那时候经常会产生一个疑问:一个C项目工程在IDE中…

【HTML+CSS+JS+VUE】web前端教程-31-css3新特性

圆角 div{width: 100px;height: 100px;background-color: saddlebrown;border-radius: 5px;}阴影 div{width: 200px;height: 100px;background-color: saddlebrown;margin: 0 auto;box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.5);}

Redis数据结构服务器

Redis数据结构服务器 什么是Redis数据结构服务器 的概念和特点 是一个开源(BSD许可),内存中的数据结构存储服务器,可用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串(strings&#xff09…

服务器引导异常,Grub报错: error: ../../grub-core/fs/fshelp.c:258:file xxxx.img not found.

服务器引导异常,Grub报错: error: ../../grub-core/fs/fshelp.c:258:file xxxx.img not found. 1. 故障现象2. 解决思路3. 故障分析4. 案件回溯5. 解决问题 1. 故障现象 有一台服务器业务报无法连接. 尝试用Ping命令发现无法ping通. 通过控制台查看发现有以下报错: error: ..…

贪心算法汇总

1.贪心算法 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 如何能看出局部最优是否能推出整体最优 靠自己手动模拟,如果模拟可行,就可以试一试贪心策略,如果不可行,可能需要动态规划。 如何验证可不可以…

Shader -> RadialGradient圆心渐变着色器详解

XML文件 <com.example.myapplication.MyViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_gravity"center"android:layout_height"400dp"/>自定义View代码 c…

【数学】概率论与数理统计(五)

文章目录 [toc] 二维随机向量及其分布随机向量离散型随机向量的概率分布律性质示例问题解答 连续型随机向量的概率密度函数随机向量的分布函数性质连续型随机向量均匀分布 边缘分布边缘概率分布律边缘概率密度函数二维正态分布示例问题解答 边缘分布函数 二维随机向量及其分布 …

IP 地址与蜜罐技术

基于IP的地址的蜜罐技术是一种主动防御策略&#xff0c;它能够通过在网络上布置的一些看似正常没问题的IP地址来吸引恶意者的注意&#xff0c;将恶意者引导到预先布置好的伪装的目标之中。 如何实现蜜罐技术 当恶意攻击者在网络中四处扫描&#xff0c;寻找可入侵的目标时&…