文章目录

  • 1. 前言
  • 2. 标量类型(Scalar)
    • 2.1. 整型(Integer)
    • 2.2. Rust 的整数形式
    • 2.3. 奇怪的问题(整数的溢出)
    • 2.4. 浮点类型(Float)
    • 2.5. 布尔类型(Bool)
    • 2.6. 字符类型(Char)
  • 3. 复合类型
    • 3.1. 元组类型(Tuple)
    • 3.2. 数组类型(Array)
    • 3.3. 数组越界访问
  • 4. 基本运算
  • #附录 1:Rust 中的运算符
  • #附录 2: 二进制补码

1. 前言

Rust 中的每个值都具有特定的数据类型,它告诉 Rust 指定了哪种数据,因此编译器知道如何处理这些数据。下面将研究两种数据类型子集:标量 (scalar) 和复合 (compound)

请记住,Rust 是一种静态类型语言,这将意味着,编译程序时需要让编译器清楚所有变量的类型。而编译器通常也可以根据具体值和代码里如何使用来推测我们声明缺省类型的变量应该使用什么类型。但是当存在多种情况时,则必须在编写过程中注明变量类型,因此注明变量类型将会是一个好习惯。

2. 标量类型(Scalar)

标量 (scalar) 类型只能表示单个值。Rust 中有四种主要的标量类型:整型浮点型布尔型字符型。(这与 C/C++ 的基本类型相同)

2.1. 整型(Integer)

整型则表示一个整数,之前我们已经见过一个整型类型 u32。其中 u 表示该整数是无符号的 (unsigned)。反之有符号的则会以 i 开头。
Rust 中的整数类型:

长度 有符号 无符号
8-bit i8 u8
16-bit i16 u16
32-bit i32 u32
64-bit i64 u64
128-bit i128 u128
arch isize usize

每种整数类型都分为两类,有符号、无符号,其每种整数类型都具有对应的长度,该长度则会限制了这种类型的可表示数值范围。
[注]:计算机中会以二进制补码的形式存储有符号数,后文的附录中将会详细对其解释。

8-bit 长度来说明问题:
u8 类型的整数由于其不需要考虑符号位,所有位都用来表示具体值,则其可表示的整数范围:[0, 28 - 1];

i8 类型的整数由于需要用最高位表示数据的正负性(最高位为 0 表示正数,为 1 表示负数),则其可表示的整数范围:[-(27), 27 - 1]

依此类推则有:
每个无符号整数可表示的整数范围 [0, 2n - 1]

每个有符号整数可表示的整数范围 [-(2n-1), 2n-1 - 1]

Rust 中有这样的整数类型 usizeisize,它们的长度取决于当前计算机的体系结构,在表格中用 arch 代替表示,如:当前的系统是 32 位架构,它们的长度则是 32 位;若当前系统是 64 位架构,它们的长度则是 64 位。

[注]:Rust 中使用 i32 作为默认的整数类型。————请记住这一点

2.2. Rust 的整数形式

Rust 中允许使用添加特定的字符来更清晰的描述整数数值。Rust 允许数字类型使用特定字符做后缀来指定类型(如,let num: u8 = 28u8;)。也可以在数字中添加下划线 _,可起到视觉分隔作用,是的数字更易阅读。(如,1_000_0000xffff_ffff

整数形式 示例
十进制(Decimal) 27_149
十六进制(Hex) 0xff_ff
八进制(Octal) 0o77
二进制(Binary) 0b1111_0000
字节(Byte 仅 u8类型) b'A' / b'a'

示例源码如下:

fn main() {let dec_num = 27_149;let hex_num = 0xaa_bb;let oct_num = 0o7_666;let bin_num = 0b1_0000;let ch: u8 = b'A';     // 字母 A 的 ASCII 码值为 65println!("The number of decimal: {dec_num}");println!("The number of hex: {hex_num}");println!("The number of octal: {oct_num}");println!("The number of binary: {bin_num}");println!("The character: {ch}");}

运行结果:

imaginemiracle:variables$ cargo runCompiling variables v0.1.0 (/home/imaginemiracle/Miracle/Code/rust_projects/variables)Finished dev [unoptimized + debuginfo] target(s) in 0.20sRunning `target/debug/variables`
The number of decimal: 27149
The number of hex: 43707
The number of octal: 4022
The number of binary: 16
The character: 65

2.3. 奇怪的问题(整数的溢出)

Boy: 等等,说了这么多就是为了希望我可以正确的为整数赋值是吗?
Girl: 对呀~
Boy: 那万一我记不住,或者我要故意用错会发生什么?
Girl: Enmmm,你想怎么样?
Boy: 呐!我现在是知道了 u8 类型的取值范围是 [0, 28 - 1],那我非要给他赋值 28,或者更大的数呢?
Girl: 啊,你你你……,我也不知道了,那我们试试吧!

让我们就用下面这小段代码来做个小小的实验。

use std::io;fn main() {let mut number = String::new();io::stdin().read_line(&mut number).expect("Failed to read line.");let number: u8 = number.trim().parse().expect("It's a number.");let test_number: u8 = number + 10;println!("Input num: {}", number);println!("The test num: {}", test_number);
}

练习的过程顺带也回顾一下之前的内容,获取标准输入,并将其转换为整数,再为其加上 10,并打印两个数字。我们先使用常规的 debug 模式来运行。

imaginemiracle:variables$ cargo runFinished dev [unoptimized + debuginfo] target(s) in 0.00sRunning `target/debug/variables`
12
Input num: 12
The test num: 22

OK,看起来没什么问题,让我们试着输入 u8 的最大值 255

imaginemiracle:variables$ cargo runFinished dev [unoptimized + debuginfo] target(s) in 0.00sRunning `target/debug/variables`
255
thread 'main' panicked at 'attempt to add with overflow', src/main.rs:30:27
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

哇呜!Rust 慌了,不知道它该干什么了。让我们再尝试使用 release 模式运行。

imaginemiracle:variables$ cargo run --releaseFinished release [optimized] target(s) in 0.00sRunning `target/release/variables`
255
Input num: 255
The test num: 9

咦!这时候会发现 Rust 不慌了,它明白自己在整数溢出的时候该怎么做。

原来 Rust 对于整数的溢出会出现两种处理行为:

Debug模式下:
Rust 遇到溢出时会直接报 panic 并终止程序运行。

Release模式下:
Rust 遇到溢出时会以 ”回环算法“(wrapping arithmetic) 处理溢出的数据。若数值超过存储范围,则根据整数类型的存储位数,从数值的低位重新计算该数值。
则将从超过得部分回归到最低位,重新开始计算该值。

简单来讲,最终的值 = 原值 % (可存储的最大值 + 1)最终值 = 原值 % ( 2n )

[注]:% 是求余符号,这里的 n 代表该类型所占位数。

例如:在 u8 类型的情况下,最大值应该为 255
若赋值为 256,则会变为 256 % (28 - 1 + 1) = 0;
若赋值为 257,则会变为 257 % (28 - 1 + 1) = 1。

2.4. 浮点类型(Float)

与大多数编程语言一样 Rust 也拥有两种不同精度的浮点类型,用来表示单精度浮点类型的 f32,以及用来表示双精度浮点类型的 f64f32 的数据使用 32 位来表示,f64 的数据使用 64 位来表示。Rust 中的默认浮点类型是 f64,因为现在的 CPU 几乎为 64 的,因此在处理 f64f32 类型的数据时所耗的时间基本相同,但 f64 可表示的精度更高。

[注]:所有的浮点类型都是有符号的。

示例:
创建浮点类型变量。

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

2.5. 布尔类型(Bool)

和大多数编程语言一样,Rust 中的布尔类型(bool)可能的值有两个:truefalsebool 类型数值的内存大小为 1 Byte

示例:
如何使用 bool 类型变量。

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

[注]:bool 类型的变量一般主要用于条件控制语句的控制条件。

2.6. 字符类型(Char)

Rust 中的 char 类型是该语言里最基本的字符类型。
示例:

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

Rust 中的基本数据类型——Rust语言基础06相关推荐

  1. c语言规定 程序中各函数之间().,C语言基础笔试题

    1.C语言程序的基本单位是____ A) 程序行 B) 语句 C) 函数 D) 字符.C.1 2.C语言程序的三种基本结构是____ A.顺序结构,选择结构,循环结构 B.递归结构,循环结构,转移结构 ...

  2. c 语言中 %是什么运算符,C 语言基础----详解C中的运算符

    C语言中又有哪些运算符呢? 如下所示: ※ 算术运算符 ※ 赋值运算符 ※ 关系运算符 ※ 逻辑运算符 ※ 三目运算符 C语言基本算术运算符如下表: 除法运算中注意: 如果相除的两个数都是整数的话,则 ...

  3. c语言数据类型_C语言基础数据类型

    点击上方"C语言中文社区",选择"设为星标★" 技术干货第一时间送达! 基本类型 基本类型就是我们在使用C语言时最基础的数据类型,包括整形(短整型,基本整型,长 ...

  4. Python程序设计语言基础06(完):组合数据类型

    目录 1. 组合数据类型概述 2. 集合类型及操作 2.1 集合类型定义 2.1.1 集合类型概念 2.1.2 集合类型定义 2.2 集合操作符 2.3 集合处理方法 2.4 集合类型应用场景 2. ...

  5. c语言中其不同数据类型,C语言中不同类型数据间的转换

    §2.4 不同类型数据间的转换 2.4.1 基本概念 C语言允许数据值从一种类型转换成另一种类型.数据类型的转换有如下三种基本形式: (1)同一类型但长度不同的数据间的转换. (2)定点方式与浮点方式 ...

  6. c语言中的标准数据类型,C语言中的基本数据类型

    编写程序: # include # include int main(void) { printf("char的长度为%d\n",sizeof(char)); //结果: 1 pr ...

  7. Java语言基础(数组)

    Java语言基础(数组概述和定义格式说明) A:为什么要有数组(容器) 为了存储同种数据类型的多个值 B:数组概念 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. 数组既可以存储基本数 ...

  8. R语言基础教程6:程序设计基础

    R语言基础教程1:数据类型 R语言基础教程2:散点图 R语言基础教程3:曲线图.误差线和图例 R语言基础教程4:柱形图 R语言基础教程5:图形页面排版 R语言基础教程6:程序设计基础 R语言基础教程7 ...

  9. c语言10以内位运算,C语言基础知识--位运算

    1.原码,反码,补码: (1)在n位的机器数中,最高位为符号位,该位为零表示为正,为一表示为负:其余n-1位为数值位,各位的值可为零或一.当真值为正时,原码.反码.补码数值位 完全相同:当真值为负时, ...

最新文章

  1. JVM致命错误日志(hs_err_pid.log)分析
  2. (4)打鸡儿教你Vue.js
  3. 劫持 function_core.php,function_core.php文件中常用函数
  4. 计算机网络中的时延有哪几部分,计算机网络中的四种延迟分别是什么?
  5. 蓝桥杯第六届C语言B——积分之谜
  6. 联想拯救者y7000加内存条_短测联想拯救者Y7000,到底值不值得买?
  7. ApacheCN Pandas 教程集
  8. 程序员爬取 5000+ 口红数据,差点比女朋友更懂口红?
  9. kubernetes实践分享
  10. 2021年中国研究生数学建模竞赛F题航空公司机组优化排班问题思路参考代码
  11. 计算机专业考研2021,2021考研:计算机考研方向,了解一下
  12. Android C++ Parcel
  13. html超链接几种写法
  14. RocketMQ读写队列
  15. 2021年全国职业院校技能大赛 “大数据技术与应用”—模拟赛题(三)
  16. 无人驾驶-控制-自行车模型
  17. STM32 用RS485进行半双工通信出现的问题
  18. 小游戏项目及分工情况
  19. 台式win7f1到f12热键取消_win10系统怎么关闭f1到f12的快捷键
  20. 手机qq浏览器支持html5,手机QQ浏览器三大法宝助HTML5开发者成功

热门文章

  1. 无线探针的原理及代码实现
  2. yarn 系统找不到指定的路径
  3. Ansys Zemax | 多边形扫描仪设计示例
  4. Android 自动化测试(5)robotium
  5. 英伟达CUVID硬解,并通过FFmpeg读取文件
  6. 从2020全球前十的数字货币交易所甄别风险
  7. java实验:银行账户类的定义与使用
  8. 微信小程序js日期格式转化及加减
  9. Spark大数据平台应用实战
  10. js 在页面打印九九乘法表