Rust圣经 阅读 数值类型

基本类型

Rust 每个值都有其确切的数据类型,分为两类:基本类型和复合类型。
基本类型往往是一个最小化原子类型,无法解构为其它类型(一般意义上来说),由以下组成:

  • 数值类型:有符号整数(i8i16i32i64isize )、无符号整数( u8u16u32u64usize )、浮点数( f32f64 )、以及有理数、复数。
  • 字符串:字符串字面量和字符串切片 &str
  • 布尔类型: truefalse
  • 字符类型:表示单个 Unicode 字符,存储为 4 个字节。
  • 单元类型:即 (),其唯一的值也是 ()

类型推导与标注

Rust 是一门 静态类型语言,编译器必须在编译期知道所有变量的类型。
但我们并不需要手动指定每个变量的类型。
Rust 编译器可以根据变量的值和上下文中的使用方式来自动推导变量的类型。
但是,在某些情况下,它也无法推导出变量类型,需要手动去给出一个类型标注。

数值类型

整数类型

有符号类型和无符号类型。8、16、32、64、128位,和视结构而定的 isizeusize。如果计算机CPU是32位,则为32位。如果是64位,则它们是64位。

整数的表示方式有:

数字字面量示例
十进制10_000
十六进制0X986
八进制0o127
二进制0b1111_0000
字节(仅限于 u8b’A’
整数溢出

当出现整型溢出时,Rust在 debug 时,会发现问题,使程序在编译时 panic。
如果在使用 release 模式构建时,Rust不会panic,而是补码循环溢出。

显式处理可能溢出的方法,使用标准库 针对原始数字类型 提出的方法:

  • 使用 wrapping_* 方法在所有模式下都按照补码循环溢出处理。
  • 如果使用 checked_* 方法时发生溢出,则返回 None 值。
  • 使用 overflowing_* 方法返回该值和一个指示是否存在溢出的布尔值。
  • 使用 saturating_* 方法使值达到最小值或最大值。

浮点类型

浮点类型数字是带有小数点的数字。
有两种类型 f32f64
默认为 f64

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

浮点数陷阱

使用浮点数不谨慎会造成错误的原因:

  1. 浮点数往往是需要的数字的近似表达。通常我们所需要的数字是十进制的,而计算机中数字是二进制的。
  2. 浮点数在某些特性上是反直觉的。

避免方法:

  1. 避免在浮点数上测试相等性
  2. 当结果在数学上可能存在未定义时,需要格外的小心。

Nan

对于数学上未定义的结果,例如对负数取平方根就没有结果,Rust的浮点类型使用 Nan (not a number) 来处理这些情况。

所有 跟 NaN交互的操作,都会返回一个 NaN,而且 NaN 不能用于比较。
可以使用 is_nan() 等方法,判断一个值是否为 NaN。

fn main() {let x = (-42.0_f32).sqrt();if x.is_nan() {println!("未定义的数学行为")}
}

数字运算

Rust 支持所有数字类型的基本数字运算:加、减、乘、除和取模运算。

位运算

Rust 的位运算与其他语言一样。

运算符说明
& 位与相同位置均为1时则为1,否则为0
位或相同位置只要有1时则为1,否则为0
^ 异或相同位置不相同则为1,相同则为0
! 位非把位中的0和1相互取反,即0置为1,1置为0
<< 左移所有位向左移动指定位数,右位补0
>> 右移所有位向右移动指定位数,带符号移动(正数补0,负数补1)
fn main() {// 二进制为00000010let a:i32 = 2;// 二进制为00000011let b:i32 = 3;println!("(a & b) value is {}", a & b);println!("(a | b) value is {}", a | b);println!("(a ^ b) value is {}", a ^ b);println!("(!b) value is {} ", !b);println!("(a << b) value is {}", a << b);println!("(a >> b) value is {}", a >> b);let mut a = a;// 注意这些计算符除了!之外都可以加上=进行赋值 (因为!=要用来判断不等于)a <<= b;println!("(a << b) value is {}", a);
}

序列 (Range)

Rust 提供了方式生成连续的数值。
1..5 ,生成 1 到 4 的连续数字,不包含 5 。
1..=5 ,生成 1 到 5 的连续数字,包含 5 。

for i in 1..=5 {println!("{}",i);
}

序列只允许用于数字或字符类型,原因是:它们可以连续,同时编译器在编译期可以检查该序列是否为空,字符和数字值是 Rust 中仅有的可以用于判断是否为空的类型。

使用 As 完成类型转换

Rust 中可以使用 As 来完成一个类型到另一个类型的转换,其最常用于将原始类型转换为其他原始类型,但是它也可以完成诸如将指针转换为地址、地址转换为指针以及将指针转换为其他指针等功能。

有理数和复数

Rust 的标准库并未包含有理数和复数。

  • 有理数和复数
  • 任意大小的整数和任意精度的浮点数
  • 固定精度的十进制小数,常用于货币相关的场景

需要使用 库 num

按照以下步骤来引入 num 库:

  1. 创建新工程 cargo new complex-num && cd complex-num
  2. Cargo.toml 中的 [dependencies] 下添加一行 num = "0.4.0"
  3. src/main.rs 文件中的 main 函数替换为下面的代码
  4. 运行 cargo run
use num::complex::Complex;fn main() {let a = Complex { re: 2.1, im: -1.2 };let b = Complex::new(11.1, 22.2);let result = a + b;println!("{} + {}i", result.re, result.im)}

总结

  1. Rust 的数值类型非常多,需要熟悉这些类型所占用的字节数。
  2. 类型转换必须是显式的。
  3. Rust的数值上可以使用方法。如取整 13.14_f32.round()

请添加图片描述

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

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

相关文章

印象笔记03 衍生软件使用

印象笔记03 衍生软件使用 Verse 以下内容来源于官方介绍 VERSE是一款面向未来的智能化生产力工具&#xff0c;由印象笔记团队诚意推出。 你可以用VERSE&#xff1a; 管理数字内容&#xff0c;让信息有序高效运转&#xff1b;搭建知识体系&#xff0c;构建你的强大知识库&am…

CMU15-445-Spring-2023-Project #0 - C++ Primer

前置任务。 Task #1 - Copy-On-Write Trie Copy-on-write (COW) Trie 在进行修改时&#xff0c;不会立即复制整个数据结构。相反&#xff0c;它会在需要修改的节点被多个引用的时候才进行复制。当要对某个节点进行写操作&#xff08;添加子节点或者继续向下insert&#xff09…

修改多选框el-checkbox样式, 大小,背景色

修改多选框el-checkbox样式, 大小,背景色 /* 背景透明 */ .el-checkbox__inner {background: transparent;border: 1px solid #00ffe5; } /* 选中样式 */ .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {b…

灸哥问答:分布式系统中数据一致性的问题如何解决

在分布式系统&#xff0c;数据一致性的问题是一个老生常谈&#xff0c;必须面对的一个问题&#xff0c;而且又极具挑战和复杂度的一个问题&#xff0c;针对数据一致性的问题&#xff0c;没有一个简单的单一的解决方案可以圆满解决&#xff0c;是需要结合具体的场景&#xff0c;…

人工智能技术在教育行业有哪些应用?

人工智能技术在教育行业有以下几个主要应用&#xff1a; 1. 个性化学习&#xff1a;人工智能可以根据学生的学习情况和特点&#xff0c;提供个性化的学习内容和教学方法。通过分析学生的学习数据和行为模式&#xff0c;AI 可以给予针对性的建议和反馈&#xff0c;帮助学生更好地…

环境准备-VMware安装

照顾到很多人不是很会环境搭建&#xff0c;我这里会将搭建的步骤讲的细致点 第一步&#xff0c;VMware下载。目的是通过VMware搭建Linux服务器&#xff0c;因为大家大部分还是Windows的电脑&#xff0c;我们先下载虚拟机搭建一个Linux系统的服务器 下载完成之后&#xff0c;点…

Java Synchronized 和 ReentrantLock

目录 介绍 synchronized synchronized 修饰实例方法 修饰静态类方法 synchronized 修饰代码块 实现细节 ReentrantLock ReentrantLock 基本使用 公平锁实现 读写锁&#xff08;ReentrantReadWriteLock&#xff09; 1. 创建读写锁对象&#xff1a; 2. 通过读写锁对象…

LeetCode 2807. 在链表中插入最大公约数

给你一个链表的头 head &#xff0c;每个结点包含一个整数值。 在相邻结点之间&#xff0c;请你插入一个新的结点&#xff0c;结点值为这两个相邻结点值的 最大公约数 。 请你返回插入之后的链表。 两个数的 最大公约数 是可以被两个数字整除的最大正整数。 示例 1&#xf…

Vue前端文字效果:如何让一段文本像是手动一个一个字打出来的

效果展示 自己做的AI聊天机器人界面&#xff0c;我觉得比微信还好看 由于这个前端略微复杂&#xff0c;下文用最简单的例子来展示&#xff1a; 分析需求 对于AI聊天工具的前端&#xff0c;如果AI生成的文本像是一个一个字打出来的&#xff0c;就会让AI看起来更像真的人&…

MySQL主从复制案例实现

使用Sharding-JDBC实现读写分离&#xff1a; 1、导入maven坐标 2、 在配置文件中配置读写分离规则 3、在配置文件中配置允许bean定义覆盖配置项 1、导入maven坐标 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jd…

SoapUI 怎么下载:实用指南

SoapUI Windows 版本下载 今天带大家过一遍 SoapUI 在 Windows 系统下的安装教程吧&#xff01;各位 开发小伙伴 们可以跟着我一起来~ 下载安装包 下载链接&#xff1a;www.soapui.org/downloads/s… 安装 安装非常简单&#xff0c;只需双击它即可启动&#xff0c;安装程序…

AWS(三):如何在AwsManagedAd目录和windowsAD实例之间建立双向信任。

前提&#xff1a; 1.创建好了一个AWS managed AD目录&#xff0c;我的目录域名为:aws.managed.com 2.创建好了一个windows AD实例并提升了为域控服务器,实例域名为:aws2.com 看过我AWS 一和二的应该都会创建windows实例了&#xff0c;切记不能将其无缝加入到aws managed AD的…

Springboot通过profiles切换不同环境使用的配置

文章目录 简介1.通过分隔符隔离2.通过使用不同的配置文件区分3.测试 简介 一个项目从开发到上线一般要经过几个环境, dev测试环境-uat预生产环境-prod生产环境&#xff0c;每个环境的使用的数据库或者配置不同&#xff0c;这时候可以通过下面两种方式区分配置,达到快速切换的效…

密码学:带密钥的消息摘要算法一数字签名算法

文章目录 前言手写签名和数字签名前置知识点&#xff1a;消息摘要算法数字签名算法数字签名算法的由来数字签名算法在实际运用的过程附加&#xff1a;签名和摘要值的解释 数字签名算法的家谱数字签名算法的消息传递模型经典数字签名算法-RSA实现 数字签名标准算法-DSA实现 圆曲…

Grafana UI 入门使用

最近项目上需要使用Grafana来做chart&#xff0c;因为server不是我在搭建&#xff0c;所以就不介绍怎么搭建grafana server&#xff0c;而是谈下怎么在UI上具体操作使用了。 DOCs 首先呢&#xff0c;贴一下官网doc的连接&#xff0c;方便查询 Grafana open source documenta…

大数据StarRocks(三) StarRocks数据表设计

1. 列式存储 1.1 列式存储方式有以下几个优点&#xff1a; 1.快速的数据查询 由于数据是按照列进行存储的&#xff0c;所以查询某个列时只需要读取该列所在的块&#xff0c;而不是整行数据&#xff0c;从而大大提高了查询效率。 2.压缩效率高 由于列式存储的数据块中只有一…

在docekr中运行openwrt镜像

1镜像下载 地址&#xff1a; https://archive.openwrt.org/releases/23.05.1/targets/x86/64/ #linux 下下载命令为 wget https://archive.openwrt.org/releases/23.05.1/targets/x86/64/openwrt-23.05.1-x86-64-rootfs.tar.gz ./#加载镜像 docker import openwrt-23.05.1-x…

计算机毕业设计——基于SSM+Layui的图书管理系统(附源码)

1&#xff0c;项目背景 国家大力推进信息化建设的大背景下&#xff0c;城市网络基础设施和信息化应用水平得到了极大的提高和提高。特别是在经济发达的沿海地区&#xff0c;商业和服务业也比较发达&#xff0c;公众接受新事物的能力和消费水平也比较高。开展商贸流通产业的信息…

HTML5-简单文件操作

文件操作 简介 概念&#xff1a;可以通过file类型的input控件或者拖放的方式选择文件进行操作 语法格式&#xff1a; <input type"file" multiple>属性 multiple&#xff1a;表示是否选择多个文件 accept&#xff1a;用于设置文件的过滤类型&#xff08;MI…

ThreadLocal线程重用导致用户信息错乱的 Bug

在生产上遇到一个诡异的问题&#xff0c;有时获取到的用户信息是别人的。查看代码后&#xff0c;我发现他使用了 ThreadLocal 来缓存获取到的用户信息。 我们知道&#xff0c;ThreadLocal 适用于变量在线程间隔离&#xff0c;而在方法或类间共享的场景。如果用户信息的获取比较…