rust中计算变量的原码,补码,反码

265 阅读3分钟

原码

原码是一种二进制编码方法,其中数值的最高位用于表示符号,剩余位用于表示数值的绝对值。

符号位: 最高位(最左边的位)表示符号。0 表示正数,1 表示负数。

数值位: 剩余的位表示数值的绝对值。

例如,对于一个 8 位整数:42 的原码表示:00101010。-42 的原码表示:10101010

反码

反码是一种表示负数的方法,它通过对数值的每一位进行取反(即 0 变 1,1 变 0)来生成。同时也是一种二进制数表示法,用于表示有符号整数。反码的出现和使用主要是为了简化硬件电路中的减法运算。理解反码的历史背景和其在计算中的用途,有助于更好地理解为什么这种表示方法被发明和使用。

**减法运算的简化:**在早期的计算机设计中,实现硬件电路的复杂度是一个重要的考虑因素。反码表示法简化了减法运算的实现:

加法和减法的统一: 使用反码表示法,可以将减法运算转换为加法运算。例如,计算 A - B 可以转换为 A + (-B),其中 -B 是 B 的反码。对于正数和负数,加法电路可以统一处理,这简化了硬件设计。

正数的反码: 与原码相同。

负数的反码: 将原码的每一位(除了符号位)取反。例如,对于一个 8 位整数:+42 的反码表示:00101010(与原码相同) -42 的反码表示:11010101(将 00101010 取反)

补码

补码是现代计算机系统中最常用的表示有符号整数的方法。补码可以通过在反码的基础上加 1 来获得。

正数的补码: 与原码相同。负数的补码: 反码加 1。例如,对于一个 8 位整数:

+42 的补码表示:00101010(与原码相同) -42 的补码表示:先求反码:11010101 反码加 1:11010101 + 1 = 11010110

总结

原码: 直接将数值的绝对值转为二进制,并在最高位添加符号位。

反码: 将原码的每一位(除了符号位)取反。

补码: 在反码的基础上加 1。

Rust 实现原码、反码、补码

fn main() {
    let numberi8 = -8// 示例数值,可以更改为任何i8类型的数值

    // 计算原码
    let original = number;
    let original_binary = format!("{:08b}", original as u8); // 直接显示原码

    // 计算反码(针对负数,正数的反码与原码相同)
    let inverted = !original;
    let inverted_binary = format!("{:08b}", inverted as u8);

    // 计算补码(针对负数,正数的补码与原码相同)
    let twos_complement = inverted + 1;
    let twos_complement_binary = format!("{:08b}", twos_complement as u8);

    // 打印结果
    println!("Number: {}", number);
    println!("Original (Binary): {}", original_binary);
    println!("Inverted (One's Complement) (Binary): {}", inverted_binary);
    println!("Two's Complement (Binary): {}", twos_complement_binary);
}

运行示例

Number: -8
Original (Binary): 11111000
Inverted (One's Complement) (Binary): 00000111
Two's Complement (Binary): 00001000