【Rust自学】3.2. 数据类型:标量类型
3.2 数据类型标量类型3.2.0. 写在正文之前欢迎来到Rust自学的第三章一共有6个小节分别是:- 变量与可变性-数据类型标量类型本文- 数据类型复合类型- 函数和注释- 控制流if else- 控制流循环通过第二章的小游戏(没看的初学者强烈建议看一下)相信你已经学会了基本的Rust语法而在第三章我们将更深一层了解Rust中的通用的编程概念。3.2.1. Rust中的变量特性Rust是静态编译语言因此编译器在编译时必须知道每个变量的类型。- 基于使用的值编译器通常能够推断出它的具体类型。- 如果可能的类型比较多就必须添加类型标注否则编译会失败。以下是一个例子:let guess 6657.parse().expect(Please enter a number);如果你把这句话放到IDE中你就会发现类似error[E0284]: type annotations needed的错误。这是因为字符串6657可以被解析成i32或u32等类型编译器不知道你想要哪一种所以需要显式标注类型。将代码改成如下即可编译通过: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^32 - 1的值。Rust的整数类型列表如下每种都分i和u以及固定的位数。有符号范围-(2^(n-1))到2^(n-1) - 1无符号范围0到2^n - 1LengthSignedUnsigned8-biti8u816-biti16u1632-biti32u3264-biti64u64128-biti128u128archisizeusizeisize和usize类型是比较特殊的两个整数类型其大小由程序运行的计算机架构所决定- 在64位机器上它们是64位。isize相当于i64usize相当于u64。- 在32位机器上它们是32位。isize相当于i32usize相当于u32。使用isize和usize的主要场景是对某种集合进行索引操作。fn main(){ let machine: u32 6657; }3.2.4. 整数字面值整数不一定是十进制的也支持其他进制。使用固定格式能让程序理解你使用的进制也使别人更容易读懂你的代码。Number literalsExampleDecimal98_222Hex0xffOctal0o77Binary0b1111_0000Byte (u8 only)bA十进制中可以加上下划线来增强可读性。十六进制以0x开头。八进制以0o开头。二进制以0b开头也可以加上下划线来增强可读性。字节字面值比较特殊。在Rust中字节整数字面值写作bX其中X是表示一个字节值的单个字符。这种字面值只能用于u8因为字节值的范围是0到255且X必须是ASCII字符。例如bA的值是65因为A的ASCII码是65。除了字节字面值所有数值字面值都可以使用类型后缀。如果不太清楚该使用哪种类型可以依赖Rust相应的默认类型。整数的默认类型是i32总体上来说速度很快即使是在64位系统中。3.2.5. 整数溢出举个例子u8的范围是0到255。如果把一个u8变量的值设为256会出现两种情况- 在调试构建中Rust会检查溢出。如果发生溢出程序会在运行时panic。- 在发布构建--release中Rust不会检查可能导致panic的溢出。- 如果确实发生溢出Rust会执行环绕运算256变成0257变成1以此类推但不会panic。3.2.6. 浮点类型Rust有两种基础的浮点类型-f3232位单精度-f6464位双精度Rust使用IEEE-754标准来表示浮点类型。f64是默认类型因为在现代CPU中f64的运行速度与f32差不多而且f64精度更高。fn main(){ let machine: f32 6657.0721; }3.2.7. 数值操作加减-乘*除/余%这些与其他语言无异。3.2.8. 布尔类型Rust的布尔类型与其他语言无异。它有两个值true和false占一个字节关键字是bool。fn main(){ let machine: bool true; }3.2.9. 字符类型Rust的char类型用来表示语言中最基础的单个字符。字符字面值使用单引号。占用4个字节。它是Unicode标量值因此可以表示远超ASCII的内容包括拼音、中日韩文、零宽字符、emoji等。其范围是从U0000到UD7FF以及从UE000到U10FFFF。Unicode实际上并没有我们通常理解的那种“字符”概念所以直觉上认识的字符也许与Rust中的概念并不完全对应。fn main(){ let x: char ; }