原码、补码、反码、移码区别及转换

原码、补码、反码、移码是计算机中表示有符号整数的不同编码方式。它们的主要区别在于表示正负数的方式以及进行数值计算时的方便性。

1. 原码(Sign-Magnitude):
   - 原码是最简单直观的表示方法,最高位表示符号位(0表示正数,1表示负数),其余位表示数值的绝对值。
   - 计算机中对原码的加减法运算比较复杂,需要进行符号位和数值位的分别处理。

2. 反码(Ones' Complement):
   - 反码是通过将原码中的数值位按位取反得到的。
   - 负数的反码表示方式保留了原码的符号位,但数值位取反。
   - 正数的反码与原码相同。
   - 反码的加减法运算可以简化为普通的二进制加法运算,但存在反码溢出和表示正零、负零的问题。

3. 补码(Two's Complement):
   - 补码是对反码的进一步改进,通过反码加1得到。
   - 负数的补码表示方式在数值位取反的基础上再加1,正数的补码与原码相同。
   - 补码的加减法运算可以简化为普通的二进制加法运算,且不会出现反码溢出的问题,同时也可以正确表示正零和负零。

4. 移码(Excess-N):
   - 移码是将补码中的固定偏移量(通常是2^(位数-1))加到补码上得到的。
   - 移码的主要作用是将有符号数转换为无符号数,便于进行数值比较和排序。
   - 在计算机中,移码并不常用于存储和运算,而更多用于显示和输出。

总的来说,原码、反码、补码是计算机内部常用的有符号整数表示方式,其中补码是最常用的表示方法,因为它能够简化数值运算,并且能够正确表示负数、零和正数。移码则用于将有符号数转换为无符号数的显示和输出。

转换方面,其他文章有更加详细的转换方式,我这里简单介绍我自己总结的方法:

只对整数部分进行转换介绍。

正数方面,原码、补码和反码都一样。

负数方面,反码的符号位不变,数值位相对原码取反;补码的符号位不变,数值位相对原码取反然后+1。(结合补码的补字容易区分记忆)

移码就是补码的符号位取反。

你可能感兴趣的:(c语言)