1、整型与运算符

整型与运算符

基本类型

在Rust中有基本的整型变量,可以通过这些基本类型去创建更加复杂的类型。

基本整型

u32类型是基本的Rust整型变量(不带小数点)

有符号和无符号

其实对应的就是C/C++里面的有无unsigned。

u32里面的u就代表unsigned(即无符号的32位整型),同样的i32代表有符号(可以表示负数)的32位整型

位宽

还是说上面的u32,这里的32其实代表了这个变量的位宽(即所占内存空间的比特大小)

Rust支持的位宽有8,16,32,64,128

所以u32类型表示的范围就是 0~232-1(类型最大值也可以记为 u32::MAX

对于有符号类型,i32的表示范围就是 -231~231-1(对应也可以记为 i32::MIN~i32::MAX )

总结

Rust中的基本整型变量

位宽 有符号 无符号
8-bit i8 u8
16-bit i16 u16
32-bit i32 u32
64-bit i64 u64
128-bit i128 u128

字面量

在Rust代码中用来表示固定值

比如,42,36 这类的纯数字就可以看作整数字面量

字面量的类型标注

这里有一点要注意一下,在Rust语言当中,任何值都要有它自己的类型,那么整型字面量的默认类型是什么呢?

在Rust中,整型字面量的默认类型为i32,也就是说如果你在定义变量或在表达式中使用整型字面量的时候,如果未指明具体类型,那么默认它的类型是i32

在定义变量时,我们可以用这样的代码

let num = 32;

这时,默认类型就是i32

我在学这一块的时候有一个想法,定义并赋值变量时,如果我未指明类型,但是整形字面量的范围超出了i32::MAX会怎样呢?也就是

let num =18_446_744_073_709_551_616;

事实上,这样做会报错

image-20250828104006572

但是有意思的事情发生了,如果我用i64::MAX作为右边赋值表达式的内容,那么就可以推断为i64

image-20250828104111947

这里就没有报错,不过我想你也注意到了,这样不就越界了吗?

是的,没错,确实是这样子

image-20250828104151182

这里的变量定义的时候,Rust应该会检测右边的最大的已知类型,作为左侧默认的类型,没有问题的话就是i32类型,不够存在缺陷,就是可能越界,这是Rust的linter(代码检查工具)所检查不到的

重新回到正题,定义变量时,我们可以指定类型,比如:

let num:i64=25565;

在变量后面加上 :类型名 即可实现指明类型

同样的,万一我想在算数表达式里指明某个字面量的类型呢?

Rust提供了这样的操作,你可以在字面量后面加上类型来指明

比如如果你想让 1+1 这个表达式里面的1以i64的类型参与运算,可以写成:

1i64+1i64

如图

image-20250828104806190

下划线分隔符

在比较大的字面量使用时,往往会眼花缭乱,比如1145141919810,你能准确且快速地说出这是一万一千四百五十一亿四千一百九十一万九千八百一十吗?哈哈哈,你可以在数字中间添加下划线,用来快速识别这个数的大小,比如改写为:

1_145_141_919_810

是不是清晰很多了

这就是下划线在整数字面量中的应用

image-20250828105158352

运算符

Rust支持的基本运算符有+,-,*,/,%

具体就不详细说了,可以参考C/C++

遵从数学里的运算优先级,可以用括号改变优先级

同时还要注意,整数除法是向下取整,我想大家也都清楚,这里也不详细说了

无自动类型转换

注意,在Rust中,自动类型转换是不被允许的,即使这个转换在C/C++等常规语言中看起来没有任何问题

image-20250828105738034

就像上面那样,b已经是u8类型的情况下,无法给u32类型的a赋值

image-20250828105841337

这样看可能会更明显一些

至于如何实现类型转换,我现在也还没学,按照C/C++的语法,(i64)100i32这样能否实现呢?不太确定,等学到再说吧!

这篇笔记写到这里了,我们下篇再见!ヾ( ̄▽ ̄)ByeBye

阅读剩余
THE END