在Rust中,一共有4中标量类型, 也就是基本数据类型,分别是:
无符号整型(Unsigned) | 有符号整型(Signed) |
---|---|
u8 | i8 |
u16 | i16 |
u32 | i32 |
u64 | i64 |
u128 | i128 |
usize | isize |
其中分为无符号整型(以u
开头),和有符号整型(以i
开头),后面的数据代表该类型在内存中占多少bits
. 其中usize
类型是个例外,usize
类型的位数取决于目标平台的架构:
usize
是 32 位的。usize
是 64 位的。usize
类型通常用于索引集合和与内存大小相关的操作,其大小与平台的内存寻址能力相匹配,确保在任何平台上都能高效地进行这些操作。例如可以用于array
或vector
的索引的类型。isize
与usize
类似,只不过它是有符号的而已。
如果在声明一个整型变量时没有显式的标准类型的话,整型变量默认会被Rust识别为i32
类型,因为这个类型的性能通常是最好的,即使是在64位的系统上也是如此。
需要注意的是,虽然Rust有这些整型,但根据你的系统位数不同,有的整型类型可能不被支持,比如在一个16-bit
的系统中,就只支持16位及以下的整型类型(u8
,i8
, u16
,i16
)和usize
, isize
.
进制 | 写法示例 | 说明 |
---|---|---|
十进制(Decimal) | 100000 | 直接以数字开头 |
十六进制(Hex) | 0xdeadbeef | 以0x 开头的数字会被识别为16进制 |
八进制(Octal) | 0o77543211 | 以0o 开头的数字会被识别为8进制 |
二进制(Binary) | 0b11110011 | 以0b 开头的数字会被识别为二进制 |
字节(byte) | b’A’ | 用b开头,单引号内为一个ASCII码范围内的字符,因此byte类型在Rust中跟u8类型是等价的,因为他们都是0-255之间的数字 |
Rust会自动忽略在数字中出现的_
, 因此可以在数字中间任意位置加上_
以方便我们阅读代码,例如:
进制 | 写法示例 | 加下划线写法 |
---|---|---|
十进制(Decimal) | 100000 | 100_000 |
十六进制(Hex) | 0xdeadbeef | 0xde_ad_be_ef |
八进制(Octal) | 0o77543211 | 0o7754_3211 |
二进制(Binary) | 0b11110011 | 0b1_1_1_1_0_0_1_1 |
浮点类型比整型简单许多,只有两种类型:
f64
, 但是如果你的操作系统位数是低于64位的, f64
的性能就会很差,这是需要注意的一点。浮点类型的格式遵循IEEE-754标准规范,由整数位,小数点和小数位组成,如:
3.1415926 // legal
.1 // illegal, 必须有整数位
0.1 // legal
在定义一个数字类型的变量时, 有两种标注类型的方法。 第一种与我们之前介绍变量声明的章节中一样:
let x: u16 = 5;
let y: f32 = 3.14;
第二种方法,也可以将类型作为后缀,放在值的后面,如下:
let x = 5u16;
let y = 3.14f32;
为了方便阅读,也可以像在上一节中所说的一样,在数字中加上_
, 如下:
let x = 5_u16;
let y = 3.14_f32;
这种方法在我们需要给一些泛型函数传递指定类型的参数时很有帮助, 比如一个函数有一个参数x
, 这个参数x
的类型可以是u16
, 也可以是u32
, 根据参数的类型不同,函数的行为会发生变化, 此时如果我需要传入的参数值为5, 那么我就需要为这个5指定类型,那么便可以写为5u16
或者 5u32
。
布尔型只有两个可能的值:
注意都是小写。 可以如下定义一个布尔型变量:
let b: bool = true;
let c = false;
布尔型不是数字,因此不可以用于数学计算,除非用as
关键词把它转换,例如:
fn main(){
let x = 10 - true;
println!("{}", x);
}
这样是会报错的, 但是改成下面这样就不会了:
fn main(){
let x = 10 - true as u8;
println!("{}", x);
}
上面的代码中true as u8
会把布尔型转换成整型(1u8),因此最终程序输出的结果是9
。
char
这个类型的命名并不准确,每个char
类型的变量应该都是一个标准的unicode
值, 例如下面的值都是合法的:
let my_letter = 'a';
let i_kratkoa = 'й' ;
let ideograph = '你';
let my_fire = ''
如上, 一个char
变量的值可能是一个英文字母,也可能是一个其他语言中的字母,也可能是一个汉字, 甚至可以是一个表情符号,还可能是一些不可打印的控制符号,只要它是在unicode
可以表示的范围内,一个char
类型的变量占4 bytes的空间。
其他语言中, string
一般都是由char
组成的, 但是在Rust中却不是。Rust中的String
中的元素是UTF-8格式的,而char
类型不是, 因此String
并没有用到char
类型。
我们的代码编辑器显示的源代码也是UTF-8格式的,因此,我们在代码中看到的一个字符,其实并不等同于Rust中的一个char
。
本章主要介绍了Rust的四种标量类型的使用方法与注意事项,下一章将介绍Rust中的复合数据类型。