You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求无比较运算符、无整数扩宽的有符号整数比较函数cmp

有符号整数比较函数实现(无比较运算符)

实现思路

要解决减法下溢问题,核心是先区分输入整数的符号是否相同:

  • 若符号不同:直接根据符号判断大小(正数必然大于负数)
  • 若符号相同:此时同符号整数相减不会产生溢出,可安全计算差值后提取符号位得到比较结果

Rust 实现代码

fn cmp(x: i32, y: i32) -> i32 {
    // 计算当前整数类型的符号位位置(比如i32的符号位是第31位)
    let sign_bit = std::mem::size_of::<i32>() * 8 - 1;
    // 提取符号位:正数为0,负数为1
    let sign_x = (x >> sign_bit) & 1;
    let sign_y = (y >> sign_bit) & 1;
    // 异或判断符号是否不同:结果为1则符号不同,0则相同
    let sign_diff = sign_x ^ sign_y;

    if sign_diff != 0 {
        // 符号不同时,正数更大:x正返回1,x负返回-1
        1 - 2 * sign_x as i32
    } else {
        // 符号相同时,计算差值(无溢出风险)
        let diff = x - y;
        // 提取差值的符号位
        let diff_sign = (diff >> sign_bit) & 1;
        // 根据差值符号返回结果:diff正返回1,diff负返回-1,diff为0返回0
        1 - 2 * diff_sign as i32
    }
}

关键细节说明

  1. 符号位提取:利用有符号整数的算术右移特性,将数值右移至符号位,再通过与1按位与得到0(正数)或1(负数)的符号标识。
  2. 溢出避免:同符号整数相减时,结果的绝对值不会超过当前类型的最大有符号值,因此不会产生溢出/下溢。
  3. 通用性:代码通过std::mem::size_of动态计算符号位位置,适配所有有符号整数类型(如i8、i16、i64),只需修改函数参数的类型即可。

内容的提问来源于stack exchange,提问作者tomdodd4598

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:44:53