【Rust自学】3.2. 数据类型:标量类型

3.2.0. 写在正文之前

欢迎来到Rust自学的第三章,一共有6个小节,分别是:

  • 变量与可变性
  • 数据类型:标量类型(本文)
  • 数据类型:复合类型
  • 函数和注释
  • 控制流:if else
  • 控制流:循环

通过第二章的小游戏(没看的初学者强烈建议看一下),相信你已经学会了基本的Rust语法,而在第三章我们将更深一层,了解Rust中的通用的编程概念。

喜欢的话记得点赞、收藏加关注哦,想要跟着学习可以关注专栏哦

3.2.1. Rust中的变量特性

Rust是静态编译语言,在编译时必须知道所有变量的类型

  • 基于使用的值,编译器通常能够推断出它的具体类型
  • 如果可能的类型比较多,就必须添加类型的标注,否则编译会报错。一下是一个例子:
rust 复制代码
let guess = "6657".parse().expect("Please enter a number")

如果你把这句话放到IDE中,你就会发现IDE提示type error:type annotations needed,这是因为6657这个值即可以被i32u32等类型容纳,编译器不知道应该用哪个类型,就需要显示标注其类型。将代码改成如下即不会报错:

rust 复制代码
let guess:u32 = "6657".parse().expect("Please enter a number")

3.2.2. 标量类型的简介

  • 一个标量类型代表一个单一的值
  • Rust主要有4个标量类型:
    • 整数类型
    • 浮点类型
    • 布尔类型
    • 字符类型

3.2.3. 整数类型:

  • 无符号整数类型(不能表示小数)以u开头,u是unsigned的简写。
  • 有符号整数类型(可以表示小数)以i开头,i是integer的简写。
  • 整数类型字母后的数字代表其占据多少位的空间,例如u32的32就表示占据32位的空间,能表示从0~2^31次方
  • Rust的整数类型列表如图:
    • 每种都分i和u,以及固定的位数
    • 有符号范围:-(2^n - 1) 到 2^n - 1
    • 无符号范围:0到2^n - 1
Length Signed Unsigned
8-bit i8 u8
16-bit i16 u16
32-bit i32 u32
64-bit i64 u64
128-bit i128 u128
arch isize usize

isizeusize类型是比较特殊的两个整数类型,其位数由程序运行的计算机架构所决定的:

  • 如果是64位计算机,那就是64位。isize就相当于i64,usize就相当于u64
  • 如果是32位计算机,那就是32位。isize就相当于i32,usize就相当于u32

使用isizeusize的主要场景是对某种集合进行索引操作。

rust 复制代码
fn main(){
	let machine:u32 = 6657;
}

3.2.4. 整数字面值

整数不一定是10进制的,也有其他的进制,使用固定的格式能让程序理解你使用的进制也使别人能看得懂你的代码。

Number literals Example
Decimal 98_222
Hex 0xff
Octal 0o77
Binary 0b1111_0000
Byte (u8 only) b'A'
  • 十进制中可以加上_来增加可读性
  • 16进制以0x开头
  • 8进制以0o开头
  • 二进制以0b开头,可以加上_来增加可读性。
  • 字节类型比较特殊,在 Rust 中,字节的整数字面值是通过b'X'表示的,其中X是单个字符,表示为字节值。这种字面值只能用于u8类型,因为字节值的范围是 0~255X必须是一个 ASCII 字符。例如:b'A'的值是65因为A的ASCII码是65。
  • 除了字节类型,所有的数值字面值都允许使用类型后缀。
  • 如果不太清楚该使用哪种类型,可以使用Rust相应的默认类型。
  • 整数的默认类型是i32,总体上来说速度很快,即使是在64位系统中。

3.2.5. 整数溢出

举个例子,u8的范围是0~255,如果把一个u8变量的值设为256,会出现两种情况:

  • 在调试模式下编译:Rust会检查数据溢出,如果溢出,程序就会在运行时panic。
  • 在发布模式(--release)下编译:Rust不会检查可能导致panic的数据溢出。
    • 如果溢出发生:Rust会执行"环绕"操作:256变成0,257变成1...但不会panic。

3.2.6. 浮点类型

Rust有两种基础的浮点类型;

  • f32:32位单精度
  • f64:64位双精度

Rust使用IEEE-754标准来表述浮点类型

f64是默认类型,因为在现代CPU中f64f32的运行速度差不多,而且f64精度更高。

rust 复制代码
fn main(){
	let machine:f32 = 6657.0721;
}

3.2.7. 数值操作

  • 加:+
  • 减:-
  • 乘:*
  • 除:/
  • 余:%
    这些与其他语言无异

3.2.8. 布尔类型

Rust的布尔类型与其他语言无异,有两个值:truefalse,占一个字节,关键字是bool

rust 复制代码
fn main(){
	let machine: bool = true;
}

3.2.9. 字符类型

  • Rust语言中的char类型被用来描述语言中最基础的单个字符
  • 字符类型的字面值使用单引号
  • 占用4个字节大小
  • 是Unicode标量值,可以表示比ASCII多得多的字符内容,包括:拼音、中日韩文、零长度空白字符、emoji等。其范围是从U+0000U+D7FF以及U+E000U+10FFFF
  • Unicode中并没有"字符"的概念,所以直觉上认识的字符也许于Rust中的概念并不相符
rust 复制代码
fn main(){
	let x:char = `🥵`;
}
相关推荐
猫头虎8 分钟前
Rust评测案例:Rust、Java、Python、Go、C++ 实现五大排序算法的执行时间效率比较(基于 OnlineGDB 平台)
java·开发语言·c++·python·golang·rust·排序算法
爱吃烤鸡翅的酸菜鱼9 分钟前
【Java】基于策略模式 + 工厂模式多设计模式下:重构租房系统核心之城市房源列表缓存与高性能筛选
java·redis·后端·缓存·设计模式·重构·策略模式
milanyangbo11 分钟前
从局部性原理到一致性模型:深入剖析缓存设计的核心权衡
开发语言·后端·缓存·架构
IT_陈寒11 分钟前
SpringBoot实战避坑指南:我在微服务项目中总结的12条高效开发经验
前端·人工智能·后端
JaguarJack14 分钟前
Laravel ObjectId 性能最强体积最小的分布式 UUID 生成扩展
后端·laravel
ftpeak23 分钟前
Rust 嵌入式开发的经验之谈
开发语言·后端·rust
Victor35625 分钟前
Redis(119)Redis的安全机制如何配置?
后端
lly20240628 分钟前
Node.js 多进程
开发语言
Victor35631 分钟前
Redis(118)Redis的缓存机制如何实现?
后端
曹绍华1 小时前
kotlin扩展函数是如何实现的
android·开发语言·kotlin