Rust的加法溢出

115次阅读

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 u64as 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 排版

正文完
 0
liushui
版权声明:本站原创文章,由 liushui 2024-08-16发表,共计830字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。