Rust有许多的数字类型
主要分为整数类型和浮点类型
各种整数类型之间的主要区分特征是
有符号与无符号
占据空间大小进行区分
所谓有符号无符号
指的是如何理解内存空间中的bit表达的含义
如果一个变量是有符号类型
那么它的最高位的那一个bit就是符号位
表示该数为正值还是负值
如果一个变量是无符号类型
那么它的最高位和其他位一样
表示该数的大小
比如一个byte大小(8bits)的数据来说
如果存的是无符号数
那么它的表达范围是0到255
如果存的是有符号数
那么它的表达范围是-128到127
关于各个整数类型所占据的空间大小
在名字中就已经表现得很明确了
Rust原生支持了从8位到128位的整数
需要特别关注的是isize和usize类型
它们占据的空间是不定的
与指针占据的空间一致
与所在的平台相关
如果是32位系统上则是32位大小
如果是64位系统上则是64位大小
// 十进制表示
let var1 : i32 = 32;
println!("{}",var1);
// 0x开头代表16进制表示
let var1 : i32 = 0xff;
println!("{}",var1);
// 0o开头代表8进制表示
let var1 : i32 = 0o55;
println!("{}",var1);
// 0b开头代表8进制表示
let var1 : i32 = 0b1001;
println!("{}",var1);
32
255
45
9
在所有的数字字面量中
可以在任意地方添加任意的下划线以方便阅读
let var = 0x_1234_ABCD;
字面量后面可以跟后缀
可代表该数字的具体类型
从而省略掉显示类型标记
// 不写类型默认为i32类型
let varc = 32;
// usize类型
let varc = 123usize;
// u8类型
let varc = 0x_ff_u8;
在Rust中我们可以为任何一个类型添加方法
整形也不例外
比如在标准库中
整数类型有一个方法是pow
它可以计算n次幂
于是我们可以这么使用
let x : i32 = 9;
println!(" 9 poser 3 = {}", 9_i32.pow(3));
甚至可以不使用变量
直接对整形字面量调用函数
println!("9 power 3 = {}", 9_i32.pow(3));
对于整数类型
如果rust编译器通过上下文无法分析出该变量的具体类型
则自动默认为i32类型
let x = 10;
let y = x * x;
println!("{}",y);
编译器只知道x是一个整数
但是具体是i8 i16 i32或者u8 u16 u32等
并没有足够的信息判断
上面列举的类型都是有可能的
在这种情况下编译器就默认把x当成i32类型处理
这么做的好处是很多时候我们不想在每个地方都明确地指定数字类型
这么做很麻烦
给编译器指定一个在信息不足情况下的缺省类型会更方便一点
enjoy