Rust的加法溢出
使用rust做内核相关开发时,在执行两个u32变量相加的时候竟然panic了,神奇,因为该操作在C语言中的话只会丢弃掉溢出位并置位eflags寄存器。
fn add(p1: u32, p2: u32) -> u32 {
return p1 + p2;
}
fn main() {
let p1: u32 = 0xfff87c4d;
let p2: u32 = 0x1705c00c;
print!("{}", add(p1, p2));
}
查阅资料后发现,Rust在执行加法运算时会检查溢出,如果发生溢出则会panic。 不过Release模式并不会panic,仅限于Debug模式。
下面是一些解决Debug模式报错的方法。
解决方案
1、小于64位的变量强转成64位运算后强转回去
想解决很简单,以我的需求而言,我希望的是在溢出的时候丢弃溢出部分,那么我可以转成u64进行运算然后再丢弃掉高位即可。
比如:
fn add(p1: u32, p2: u32) -> u32 {
return (p1 as u64 + p2 as u64) as u32;
}
fn main() {
let p1: u32 = 0xfff87c4d;
let p2: u32 = 0x1705c00c;
print!("{:X}", add(p1, p2));
}
但是这个做法也仅限于32位变量的加法了
2、使用unchecked_add
fn add(p1: u32, p2: u32) -> u32 {
return unsafe { p1.unchecked_add(p2) };
}
fn main() {
let p1: u32 = 0xfff87c4d;
let p2: u32 = 0x1705c00c;
print!("{:X}", add(p1, p2));
}
本文使用 markdown.com.cn 排版
正文完