04_rust的数据类型

数据类型

有 标量和复合类型
rust是静态编译语言,需在编译时知道所有变量的类型。
1)通常基于变量上下文使用的值,编译器能推断出具体类型。
2)若可能的类型存在多种,则需手动标注,如下例子。

let d: u32 = "56".parse().expect("not a num"); // 因为可转换的类型很多,如果不指定类型会编译报错

标量类型

一个标量类型代表一个单个的值
rust有四个主要的标量类型:

  • 整数类型
  • 浮点类型
  • 布尔类型
  • 字符类型

整数类型

整数,如u32为无符号32位整数类型,无符号u开头,有符号i开头。
数据范围:有符号 -(2^n-1) ~ 2^(n-1)-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

注:isize和usize由程序运行的计算机架构决定,如果时32位机是32位的,如果是64位机是64位的。

整数字面值

Num literals example
Decimal 10_999 (可用下划线间隔增加可读性)
Hex 0xff
Octal 0o77
Binary 0b1111_0000
Bite(u8 only) b'A'

除了byte类型外,所有数值字面值都允许使用 类型后缀,如255u8。不加后缀则会有默认类型。
整数的默认类型是i32,特点是计算速度快,在64位系统中也是。

整数溢出
如u8的范围是0-255,如赋值成256,则:

  • 1)调试模式下,rust会检查整数溢出,若溢出会在运行时panic。
  • 2)发布模式下(加-release编译),rust不会检查导致panic的溢出。这时若溢出则超过的高位丢失,发生环绕操作,256为0,257为1,程序能正常运行,不会panic。

浮点类型

两种浮点类型:

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

rust的浮点类型使用了IEEE-754标准来描述。
f64是默认类型,因当下cpu处理f64和f32速度差不多,且精度更高。

let x = 2.0; // f64
let y: f32 = 3.0; // f32


复合类型

可存多个值,容器。
rust提供了两种基础复合类型:元组(Tuple)、数组

元组(Tuple)

  • Tuple可存放多个类型多个值
  • 长度固定,一旦声明,无法改变

创建Tuple
在小括号里,将数值用逗号隔开,每个位置对于一类型,各元素类型不必相同。

let tup: (i32, f64, u8) = (50, 6.5, 8);

获取Tuple的元素值
使用模式匹配来解构(destructure)一个Tuple来获取元素的值

let tup: (i32, f64, u8) = (50, 6.5, 8);
let (x, y, z) = tup;

访问Tuple的元素
在tuple变量使用点标记法,后接元素的索引号。

let tup: (i32, f64, u8) = (50, 6.5, 8);
printfln!("{} {} {}", tup.0, tup.1, tup.2);

数组

  • 数组可存放多个值
  • 数组每个元素类型必须相同
  • 数组长度固定

声明数组

let a = [1, 2, 3];

如果数组每个元素都一样,则可使用如下方法声明

let a = [2; 3]; 相当于 let a = [2, 2, 2];

数组的用处:存放在stack(栈)上的连续内存,而不是在heap(堆)上,固定数量的元素。不过数组没有Vector灵活。

数组的类型

let a: [i32; 3] = [1, 2, 3];

数组的访问
使用索引访问,若越界访问,编译时会简单检查,编译时能确定越界则会报错,运行时才确定的索引导致的越界,则编译无法报错,运行时会报越界错误,runtime时panic。

let a: [i32; 3] = [1, 2, 3];
let b = a[1];
let c = a[3]; // 常数索引,编译时可确定越界,编译报错,index out of bounds: the length is 3 but the index is 3
let d = [3, 4];
let e = a[d[0]]; // 这种也会编译报越界错误,可见编译时做了简单的数据流分析
posted @ 2023-10-12 00:36  00lab  阅读(20)  评论(0编辑  收藏  举报