上一期我们介绍了常量、变量及常用的基本数据类型,在课程的最后我们编写了一个使用常量和变量的例子,大家在观看视频后一定要动手编写运行一下。编程语言就像一个兵器,好比是一把宝剑,无论你读多少武林秘籍看过多少剑术表演不去自己把剑拿起来去感觉下它的重量去舞动下你就永远不会成为一个用剑的高手。
这一期我们继续介绍 rust 提供的基本数据类型。
数据类型分为俩大类,一类是用来表示单个值的我们称为单量数据类型(Scalar Types)也有人称为标量数据类型。一类是表示有多条数据的我们称为复合类型也就是可以表示多条数据的类型(Compound Types)。在单量数据类型中又包含整数数据类型(Integer)、浮点数(Floating-point)数据类型、布尔(Boolean)数据类型和字符(Character)数据类型4种基本数据类型。按照是否可以包含小于零的数也就是负数又将整数数据类型分为有符号(Signed)整数类型和无符号(Unsigned)整数类型。这里的符号就是指的表示数据是正数还是负数的正负号。使用 u 前缀表示无符号, i 前缀表示有符号。按照用于存储数据所使用的位数又分为8位、 16 位、 32 位、 64 位、 128 位无符号和有符号整数类型。这里需要注意:
这里说的位不是指的个、十、千、百、万这样的数据位而是比特位,一个比特位的值只能是 0 或 1 ,如果有 8 个比特位做排列组合也就会有 2 的 8 次方种不同的排列组合,也就是 256 种,所以 8 位的无符号整数类型只能表示从 0 到 255 的 256 个整数。如果是有符号类型还需要使用一个比特位来表示是正数还是负数,所以就只有 7 个比特位可以用来表示数字了,也就只能表示从负的 2 的 7 次方到正的 2 的 7 次方减 1 的整数了,也就是 -128 到正的 127 这 256 个整数。这里我们可以总结成规律:
n 位的无符号整数类型能够表示的数据范围为从 0 到 2 的 n 次方减一, n 位的有符号整数类型能够表示的数据范围从负的 2 的 n 减 1 次方到正的 2 的 n 减 1 次方再减 1。
根据这个公式我们就可以计算出 16 位、32 位、 64 位、 128 位所能表示的数据范围了。从 32 位开始所能表示的数字已经很大了,我们没必要把完整的数字记下来,可以只记下数量级,这里为什么需要大家注意不同整数类型可以表示的数据范围呢?
因为如果你需要存储的数字超出了你选用的数据类型,程序很可能会报错或者会得不到预想的结果,比如我们声明一个 8 位的无符号整数类型的变量 i ,给它赋值为 256 ,由于 256 已经超过了 8 位的无符号整数所能表示的整数数据范围,这个时候如果程序没有报错,那 i 的值也会是 1 而不是 256。这是相当危险的。如果这是一个账户程序,人家本来有 255 块钱,又存进去一块反而就只有 1 块钱了。所以我们一定要注意选择合适长度的整数类型,尽量选择偏大点的,但也不能都用最大的 128 位,因为这样会浪费内存影响性能。
整数数据类型里还有俩个比较特殊的一个是 usize 一个是 isize ,并没有明确具体的位数,这是因为这俩个类型具体位数跟程序运行的操作系统有关,如果操作系统是 32 位的那它们就等价于 u32 和 i32 ,如果操作系统是 64 位的那他们就等价于 u64 和 i64。
在我们生活中遇到的数字未必都是整数,有时候也会遇到带小数的数字,比如你的考试成绩 99.5 分,这种带小数的数字在 Rust 中使用浮点数类型表示,这里的浮点可以理解为小数点方便记忆。在 Rust 中浮点数数据类型并不像整数数据类型需要区分有符号和无符号,都是有符号的所以也就不需要 u/i 前缀 。
f32 能表示的数据范围为: -1.1755*10 的负 38 次方 到 3.4028×10 的 38 次方
f64 能表示的数据范围为: -2.2250*10 的负 308 次方到 1.7977*10 的 308 次方
可见 64 位的浮点数完全可以满足日常需要。
学习了整数和浮点数我们就可以使用 Rust 做算术题了,比如我们需要计算 1024 乘以 0.8 等于多少?
使用 vim 打开 main.rs 文件,按 i 键进入编辑模式,使用双斜杠注释掉上一期的代码,在我们的练习代码中可能会出现一些没有讲解的知识点,大家可以先按照课程照着写,我们在后面会做讲解。如果有问题也可以通过平台给我们留言,定义一个 u16 类型的变量 i 并赋值为 1024, 为什么不是 u8 类型的呢?
因为 u8 类型只能表示 0 到 255 的整数, 1024 已经超出了它所能表示的范围。
再定义一个 f32 类型的变量 j 并赋值为 0.8;再定义一个 u16 类型的变量 m 其值为 i*j 也就是 1024 乘以 0.8 ,在数字运算中我们使用 * 号代表乘号。在 println 中输出变量 m, 编写好后输入 : wq 保存并退出 执行 cargo run 命令编译并运行当前程序。
我们在控制台中就看到了 1024 乘以 0.8 的运算结果。
同样的我们也可以计算出 1024 加 0.8,1024 除以 0.8 , 1024 减去 0.8 的结果
快动手试下吧。如果在尝试过程中遇到问题,欢迎通过平台给我们留言!