Rust语言入门第五篇-数据类型

文章目录

  • 数据类型
    • 1.标量类型
      • 1. 整数类型
      • 2.浮点数类型
        • f32 和 f64
        • 示例代码
        • 注意事项
      • 3.布尔类型
      • 4.字符类型
    • 2.复合类型
    • 整数类型技术细节
      • 1. 检查溢出(Checking Overflow)
      • 2. 溢出时 panic(Panic on Overflow)
      • 3. 使用 Wrapping 模式(Wrapping Behavior)

数据类型

在Rust中,每个值都有一个明确的数据类型,这告诉Rust如何处理这个值。数据类型分为两类子集:标量(scalar)和复合(compound)。

需要记住的是,Rust是一种静态类型语言,这意味着在编译时必须知道所有变量的类型。通常情况下,根据值及其使用方式,编译器可以推断出我们想要的类型。

1.标量类型

在Rust中,标量类型代表单个的简单数据。主要的标量类型包括:

  1. 整数类型(Integer Types):表示整数值,可以是有符号或无符号的。例如,i32 表示有符号的 32 位整数,u64 表示无符号的 64 位整数。

  2. 浮点数类型(Floating-Point Types):表示带有小数点的数值。例如,f64 表示双精度浮点数。

  3. 布尔类型(Boolean Type):表示逻辑值,只能是 truefalse

  4. 字符类型(Character Type):表示单个 Unicode 字符,用单引号括起来,例如 'a'

1. 整数类型

下面是 Rust 中整数类型的表格形式:

长度有符号类型无符号类型
8-biti8u8
16-biti16u16
32-biti32u32
64-biti64u64
128-biti128u128
archisizeusize

在Rust中,有符号整数类型可以表示正数、负数和零,而无符号整数类型只能表示非负数(即零和正数),不能表示负数。

具体来说:

  • 有符号整数类型(Signed Integer Types):使用一位来表示符号(正或负),其余位表示数值。例如,对于 i8 类型,8 个位中的第一位表示符号,剩下的 7 位表示数值范围。

  • 无符号整数类型(Unsigned Integer Types):所有位都用来表示数值,因此只能表示非负数。例如,对于 u8 类型,所有 8 个位都用来表示数值范围。

使用有符号类型或无符号类型取决于你的数据表示需求。通常情况下,如果你知道值永远不会是负数,可以选择无符号类型,这样可以利用更大的范围来表示正数。但如果负数也是可能的,那么需要使用有符号类型。

fn main() {// 有符号整数示例let x: i8 = -5;    // 8-bit signed integerlet y: i16 = -300; // 16-bit signed integerlet z: i32 = -100000; // 32-bit signed integer// 无符号整数示例let a: u8 = 42;     // 8-bit unsigned integerlet b: u16 = 500;   // 16-bit unsigned integerlet c: u32 = 100000; // 32-bit unsigned integerprintln!("有符号整数示例:");println!("x: {}", x);println!("y: {}", y);println!("z: {}", z);println!("无符号整数示例:");println!("a: {}", a);println!("b: {}", b);println!("c: {}", c);}

在这里插入图片描述

在 Rust 中,标准库提供了一系列的整数类型,包括有符号和无符号的整数类型,以及不同位数的整数类型,用来满足不同的需求。

  • i8i16i32i64i128 是有符号整数类型,分别表示 8 位、16 位、32 位、64 位和 128 位的有符号整数。
  • u8u16u32u64u128 是无符号整数类型,分别表示 8 位、16 位、32 位、64 位和 128 位的无符号整数。

这些整数类型都是 Rust 编程语言的一部分,用来在代码中表示不同范围和精度的整数值。

无符号整数类型只能表示非负数(即零和正数),不能表示负数。强行为负数会进行提示不可以这样这样编写并 且执行会报错
在这里插入图片描述

Rust 中各种整数类型的存储范围:

类型存储大小最小值(包括)最大值(包括)
i88 位-128127
u88 位0255
i1616 位-32,76832,767
u1616 位065,535
i3232 位-2,147,483,6482,147,483,647
u3232 位04,294,967,295
i6464 位-9,223,372,036,854,775,8089,223,372,036,854,775,807
u6464 位018,446,744,073,709,551,615
i128128 位-(2^127)2^127 - 1
u128128 位02^128 - 1

2.浮点数类型

Rust 有两个原生的 浮点数(floating-point numbers)类型,它们是带小数点的数字。Rust 的浮点数类型是 f32 和 f64,分别占 32 位和 64 位。默认类型是 f64,因为在现代 CPU 中,它与 f32 速度几乎一样,不过精度更高。所有的浮点型都是有符号的。

f32 和 f64
  • f32:单精度浮点数,占据 32 位内存空间,提供约 7 位有效数字的精度。
  • f64:双精度浮点数,占据 64 位内存空间,提供约 15-16 位有效数字的精度。
示例代码
fn main() {let x: f32 = 3.14;let y: f64 = 3.141592653589793;println!("x: {}", x);println!("y: {}", y);
}

在这里插入图片描述

32 位内存空间,提供约 7 位有效数字的精度。占据 64 位内存空间,提供约 15-16 位有效数字的精度。
在这里插入图片描述
示例代码中的f32和f64 是标准库提供的整数类型

注意事项
  1. 精度和范围:使用 f32f64 类型时,需要注意其精度和表示范围。f32 提供的精度相对较低,但范围更广,适用于需要节省内存空间或表示较大范围的浮点数。而 f64 提供更高的精度,适用于对精度要求较高的场景。

  2. 浮点数运算:在进行浮点数运算时,需要注意浮点数的精度问题可能会导致精度损失和舍入误差。因此,在比较浮点数时,应该避免直接使用相等性比较,而应该考虑使用误差范围内的比较。

  3. 特殊值:浮点数类型支持特殊值,如正无穷大、负无穷大和 NaN(Not a Number)。这些特殊值可以通过相应的常量来表示,例如 std::f32::INFINITYstd::f32::NEG_INFINITYstd::f32::NAN

fn main() {let inf: f32 = std::f32::INFINITY;let neg_inf: f32 = std::f32::NEG_INFINITY;let nan: f32 = std::f32::NAN;println!("Positive Infinity: {}", inf);println!("Negative Infinity: {}", neg_inf);println!("NaN: {}", nan);
}

在 Rust 中,使用浮点数类型需要谨慎处理精度和范围,并且需要了解浮点数运算可能存在的误差和特殊值。

3.布尔类型

Rust 中的布尔类型使用 bool 表示,它只有两个可能的值:true 和 false。与其他大多数编程语言一样

fn main() {let is_raining = true;let is_sunny: bool = false;if is_raining {println!("Remember to bring an umbrella!");} else if is_sunny {println!("Don't forget your sunglasses!");} else {println!("Enjoy the weather!");}
}

4.字符类型

Rust 的 char 类型是语言中最原生的字母类型,Rust的 char 类型大小为 4 个字节,代表 Unicode标量值,这意味着它可以支持中文,日文和韩文字符等非英文字符甚至表情符号和零宽度空格在 Rust 中都是有效的 char 值。

fn main() {let heart_emoji = '❤';let zh_character = '中';let smiley = '😊';println!("Heart Emoji: {}", heart_emoji);println!("Chinese Character: {}", zh_character);println!("Smiley: {}", smiley);
}

在 Rust 中,要注意用单引号表示字符字面量,而双引号则用于字符串字面量。Char 类型大小为四个字节,代表 Unicode 标量值,因此支持各种语言字符、表情符号和零宽度空格。需要留意的是,Unicode 中不存在 “字符” 这一概念,因此人们的直觉可能与 Rust 的 char 不完全匹配。Unicode 标量值范围广泛,从 U+0000 到 U+D7FF 和 U+E000 到 U+10FFFF。

2.复合类型

在 Rust 中,复合类型是指能够将多个值组合在一起的类型。这些类型允许你在一个变量中存储多个值,并以某种方式对它们进行组织和访问。主要的复合类型包括元组(Tuple)和数组(Array)。

  1. 元组(Tuple):元组是一个固定大小的有序集合,可以包含不同类型的元素。元组使用圆括号 () 表示,元素之间用逗号 , 分隔。元组的长度是固定的,一旦创建后不能改变。元组允许通过索引访问其中的元素。

    let my_tuple: (i32, f64, char) = (10, 3.14, 'A');
    

元组的长度是固定的长度是固定的因此 定义长度之后必须要把值填满,否则会报错哦
在这里插入图片描述

fn main() {let tup = (500, 6.4, 1);let (x, y, z) = tup;println!("The value of y is: {y}");
}

程序首先创建了一个元组并绑定到 tup 变量上。接着使用了 let 和一个模式将 tup 分成了三个不同的变量,x、y 和 z。这叫做 解构(destructuring),因为它将一个元组拆成了三个部分。最后,程序打印出了 y 的值,也就是 6.4。

在这里插入图片描述

在 Rust 中,你可以使用元组的索引值来访问元组中的特定元素。元组的索引从 0 开始,即第一个元素的索引是 0,第二个元素的索引是 1,以此类推。以下是一个简单的示例:

let my_tuple: (i32, f64, char) = (10, 3.14, 'A');// 访问第一个元素
let first_element = my_tuple.0;
println!("First element: {}", first_element); // 输出: First element: 10// 访问第二个元素
let second_element = my_tuple.1;
println!("Second element: {}", second_element); // 输出: Second element: 3.14// 访问第三个元素
let third_element = my_tuple.2;
println!("Third element: {}", third_element); // 输出: Third element: A

不带任何值的元组有个特殊的名称,叫做 单元(unit) 元组

  1. 数组(Array):数组是一组相同类型的固定大小元素的集合。数组使用方括号 [] 表示,需要在声明时指定数组的长度。数组的长度也是固定的,一旦创建后不能改变。数组的所有元素都具有相同的类型

    let my_array: [i32; 5] = [1, 2, 3, 4, 5];
    

在 Rust 中,你可以使用索引值来访问数组中的特定元素。数组的索引同样从 0 开始,即第一个元素的索引是 0,第二个元素的索引是 1,以此类推。以下是一个简单的示例:

let my_array: [i32; 5] = [1, 2, 3, 4, 5];// 访问第一个元素
let first_element = my_array[0];
println!("First element: {}", first_element); // 输出: First element: 1// 访问第三个元素
let third_element = my_array[2];
println!("Third element: {}", third_element); // 输出: Third element: 3

在这里插入图片描述
数组的长度也是固定的 因此定义长度之后必须要把值填满,否则会报错哦

整数类型技术细节

在 Rust 中,整数溢出是指当一个整数的值超出了其所能表示的范围时发生的情况。Rust 提供了多种方式来处理整数溢出,包括检查溢出、panic on overflow 和使用 Wrapping 模式。下面我将详细介绍这些方式,并提供相应的示例代码。

1. 检查溢出(Checking Overflow)

在 Rust 中,可以使用 checked_addchecked_subchecked_mul 等方法来检查整数加法、减法、乘法是否会导致溢出。这些方法返回一个 Option 类型,如果计算结果在整数类型能表示的范围内,则返回 Some,否则返回 None

示例代码:

fn main() {let x: i32 = 2147483647;let y = x.checked_add(1); // 检查加法溢出match y {Some(result) => println!("Result: {}", result),None => println!("Overflow occurred!"),}
}

在这里插入图片描述

2. 溢出时 panic(Panic on Overflow)

如果希望在发生溢出时立即停止程序并产生 panic,可以使用 overflowing_addoverflowing_suboverflowing_mul 等方法。这些方法返回一个元组,其中第一个元素是计算结果,第二个元素是一个布尔值,表示是否发生了溢出。

示例代码:

fn main() {let x: i32 = 2147483647;let (result, overflow) = x.overflowing_add(1); // 检查加法溢出if overflow {panic!("Overflow occurred!");} else {println!("Result: {}", result);}
}

在这里插入图片描述

3. 使用 Wrapping 模式(Wrapping Behavior)

如果希望在发生溢出时按照模运算的方式处理,可以使用 wrapping_addwrapping_subwrapping_mul 等方法。这些方法会对溢出的部分进行截断,并返回一个包装过的结果。

示例代码:

fn main() {let x: i32 = 2147483647;let result = x.wrapping_add(1); // 检查加法溢出println!("Result: {}", result); // 结果会是 -2147483648
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/819510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hadoop编程之工资序列化排序

数据集展示 7369SMITHCLERK79021980/12/17800207499ALLENSALESMAN76981981/2/201600300307521WARDSALESMAN76981981/2/221250500307566JONESMANAGER78391981/4/22975207654MARTINSALESMAN76981981/9/2812501400307698BLAKEMANAGER78391981/5/12850307782CLARKMANAGER78391981/…

【C语言基础】:预处理详解(二)

文章目录 一、宏和函数的对比二、#和##运算符2.1 #运算符2.2 ##运算符 三、#undef四、命令行定义五、条件编译六、头文件的包含1. 头文件包含的方式2. 嵌套文件包含 上期回顾: 【C语言基础】:预处理详解(一) 一、宏和函数的对比 宏通常被应有于执行简单…

蓝桥杯-回文日期

回文日期&#xff1a;回文日期 //找到一个年份&#xff0c;倒序输出符合条件就行 #include<iostream> using namespace std; string tmp1,tmp2; int mx0; int flag11,flag20; bool is(int n){int date[20]{0,31,28,31,30,31,30,31,31,30,31,30,31};int dayn%100;int m…

【Quartz】Quartz表的SQL语句,版本2.3.0

下载地址 https://www.quartz-scheduler.org/downloads/files/quartz-2.3.0-distribution.tar.gz 文件所在路径 quartz-2.3.0-SNAPSHOT\src\org\quartz\impl\jdbcjobstore 一般使用MySQL的场景下关注tables_mysql.sql和tables_mysql_innodb.sql两个文件即可&#xff0c;笔者…

Web前端-JavaScript

黑马程序员JavaWeb开发教程 文章目录 一、js引入方式1、内部脚本2、外部脚本 二、js基础语法1、书写语法&#xff08;1&#xff09;基本语法&#xff08;2&#xff09;输出语句 2、变量&#xff08;1&#xff09;变量&#xff08;2&#xff09;注意事项 3、数据类型、运算符、流…

腾讯云服务器CVM标准型S8实例CPU内存、网络和存储性能测评

腾讯云第八代云服务器标准型S8实例基于全新优化虚拟化平台&#xff0c;CPU采用Intel Emerald Rapids 全新处理器&#xff0c;睿频3.0GHz&#xff0c;内存采用最新DDR5&#xff0c;默认网络优化&#xff0c;最高内网收发能力达4500万pps&#xff0c;最高内网带宽可支持120Gbps。…

Docker搭建LibreSpeed

LibreSpeed 是一个轻量级的网络速度测试工具&#xff0c;它使用 JavaScript 编写&#xff0c;通过 XMLHttpRequest 和 Web Workers 进行数据传输&#xff0c;无需 Flash、Java 或 WebSocket 支持。LibreSpeed 提供了类似于 Speedtest by Ookla 的本地部署解决方案&#xff0c;可…

人工智能2024年发展方向

预计到2024年&#xff0c;人工智能领域将继续迅速发展&#xff0c;主要的发展方向可能包括&#xff1a; 强化学习的进一步应用&#xff1a;强化学习在自动驾驶、游戏、金融等领域已经取得了一定成就&#xff0c;未来将继续深入研究和应用&#xff0c;包括在更复杂的环境中的实际…

java编译过程

java编译器将 java 源文件转换成 class 文件的过程。 &#xff08;1&#xff09;词法分析器 作用&#xff1a;将Java源文件的字符流转变成对应的Token流 每个词法单元&#xff08;token&#xff09;都有一个类型&#xff08;token type&#xff09;和一个值&#xff08;toke…

Ollama教程——使用langchain:ollama与langchain的强强联合

Ollama教程——使用langchain&#xff1a;ollama与langchain的强强联合 简介背景知识ollama简介langchain简介结合使用的重要性 环境搭建安装LangChain安装ollama环境设置 加载文档使用WebBaseLoader加载《奥德赛》 文档处理分割文档 向模型提问构建查询使用文档内容进行查询创…

Vue3+Vant开发:登录功能

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

小米SU7的防晒秘籍

在春日渐暖的日子里&#xff0c;夏天悄然而至。大家有没有从衣柜深处翻出夏衣和防晒装备&#xff0c;来迎接夏日阳光的“偏爱”呢&#xff1f; 深知防晒烦恼的小米&#xff0c;在小米SU7的设计中也充分考虑了汽车防晒这一痛点&#xff0c;采用前风挡三层镀银、天幕双层镀银、四…

阐述使用 HttpClient 进行 http 请求

1 概述 &#xff08;1&#xff09;HTTPClient 实现了所有 HTTP 的方法&#xff08;包括 GET、POST、PUT、DELETE、OPTIONS 等&#xff09;&#xff0c;使用该工具包可以很方便的发起http请求。 &#xff08;2&#xff09;Maven 依赖 <dependency><groupId>org.…

漂亮,功能就差?错!优秀B端一定是颜值、体验、功能三位一体。

每次发一些漂亮的B端页面&#xff0c;都会有些人跳出来怼&#xff0c;他们都有一个固定的思维模式&#xff1a;漂亮的B端&#xff0c;一定功能差。这就好比马路上看到开豪车的美女&#xff0c;就觉得钱来路不正。 先给大家看一些过气的B端界面&#xff0c;是不是有似曾相识的感…

Java 集合【补充复习】

Java 集合【补充复习】 Java 集合概述Collection 接口继承树Map 接口继承树 Collection 接口方法使用 iterator 接口遍历集合元素使用 forearch 遍历集合元素 List 接口List 实现类之一&#xff1a;ArrayListList 实现类之二&#xff1a;LinkedList Set 接口Set 实现类之一&…

【Alphalens】使用Alphalens配合Akshare进行双均线因子分析,附源码及常见问题

Alphalens 是非常著名的一个python因子分析库。但是该库由于目前已经不怎么维护&#xff0c;问题非常多。最新的使用建议使用alphalens-reloaded&#xff0c;地址&#xff1a;stefan-jansen/alphalens-reloaded: Performance analysis of predictive (alpha) stock factors (gi…

【数据结构|C语言版】顺序表应用

前言1. 基于动态顺序表实现通讯录1.1 通讯录功能1.2 代码实现1.2.1 SeqList.h1.2.2 SeqList.c1.2.3 Contact.h1.2.4 Contact.c1.2.5 test.c 1.3 控制台测试1.3.1 添加联系人1.3.2 删除联系人1.3.3 修改联系人1.3.4 查找联系人1.3.5 清空通讯录1.3.6 通讯录读档和存档 2. 好题测…

Netty 心跳(heartbeat)——服务源码小结(四十三)

ldleStateHandler 可以实现心跳功能&#xff0c;当服务器和客户端没有任何读写交互时&#xff0c;并超过了给定的时间&#xff0c;则会触发用户 handler 的 userEventTriggered 方法。用户可以在这个方法中尝试向对方发送信息&#xff0c;如果发送失败&#xff0c;则关闭连接。…

Java SPI机制详解

Java SPI机制详解 1、什么是SPI&#xff1f; SPI 全称为 (Service Provider Interface) &#xff0c;是JDK内置的一种服务提供发现机制。SPI是一种动态替换发现的机制&#xff0c; 比如有个接口&#xff0c;想运行时动态的给它添加实现&#xff0c;你只需要添加一个实现。我们…

力学笃行(五)Qt QWidgets类

Qt QWidgets类 QDockWidgetQDockWidget与QToolBar&#xff1a;QDockWidget与QMenuBar&#xff1a; QDockWidget QDockWidget属于Qt的窗口部件&#xff08;Widgets&#xff09;模块&#xff0c;这个模块提供了一组用于构建图形用户界面&#xff08;GUI&#xff09;的基本控件和…