求无比较运算符、无整数扩宽的有符号整数比较函数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按位与得到0(正数)或1(负数)的符号标识。
- 溢出避免:同符号整数相减时,结果的绝对值不会超过当前类型的最大有符号值,因此不会产生溢出/下溢。
- 通用性:代码通过
std::mem::size_of动态计算符号位位置,适配所有有符号整数类型(如i8、i16、i64),只需修改函数参数的类型即可。
内容的提问来源于stack exchange,提问作者tomdodd4598
相关产品推荐
相关产品推荐

