符号数的表示:彻底弄清原码、反码、补码的关系

2018年6月26日 6 条评论 159 次阅读 0 人点赞

写在前面

在阅读本文前,我默认你已经了解一些关于进制、比特、符号数等的知识。计算机对符号数的表示方法涉及原码、反码和补码,它们是容易混淆的概念。本文讲尽力讲解它们三者之间的区别和联系。

首先要说明的是,本文中的“反码”“补码”两个个词汇指的是对一个二进制数的变换方法,而“源码形式”“反码形式”“补码形式”三个词汇指的是用来表示符号数的三种方式。在本文中,有无“形式”二字表示的是不同概念。而在其它许多文章中,“原码”“反码”“补码”常常指的是“源码形式”“反码形式”“补码形式”,读者需要注意。

这里先放上一个结论:计算机是以补码形式来储存有符号整数的

本文地址: https://www.jedbit.com/article/how-computer-store-signed-numbers.html

反码和补码

反码:对二进制数中的每一位取反得到它的反码,即 0 变 1,1 变 0。如 01010100 的反码是 10101011。

补码:反码加 1 得到补码。如 01010100 的补码是 10101011+1=10101100。

注意,以上三个概念与符号数无关,它们只是对二进制数做的变换。

 

符号数

符号位

首先明确符号位的概念。无论是哪种符号数表示方法,最左侧的比特都代表符号,0 代表正数,1代表负数。除了符号位的剩余比特是数值位。例如,对于一个 8 位二进制数,第 1 位是符号位,后面 7 位才表示数值。应避免表示绝对值过大的数字造成溢出。

原码形式

原码形式也称符号数值形式(Sign-Magnitude Form)。

原码形式表示的正数是其本身,且符号位为 0;负数与其绝对值具有相同的数值位,但符号位为 1

如 +25 的原码为 00011001,-25 的原码为 10011001。在源码形式中,负数与其绝对值仅在符号位不同。特别地,00000000(原) 和 10000000(原) 都表示数字 0。

 

反码形式

反码形式表示的正数和原码形式相同;负数是其绝对值的反码。

也就是说,要想将一个正数变为它的相反数,需要将其符号位变为 1,然后对数值位逐位取反。如 -25 的补码为11100110。特别地,00000000(反) 和 11111111(反) 都表示数字 0。

本文地址: https://www.jedbit.com/article/how-computer-store-signed-numbers.html

补码形式

补码形式表示的正数和原码形式相同;负数是其绝对值的补码。

如要得到 -25 的补码,先对 +25 的取反得其反码 11100110,再加一得到 11100111。

 

补码的优点

只有一个 0

前面看到了,在原码形式和反码形式中,数字 0 都有两个,分别是 “+0” 和 “-0”,而在补码中,0 就只有唯一的表示方法了,即 00000000。

转换逻辑简单

对以二进制数取反加一可以得到其补码,对此补码取反加一可以反推回原二进制数。也就是说,该操作的正逆过程依赖完全相同的逻辑。

计算方便

如果进行更深层的研究就可以发现,计算机在做减法运算时,减去某个数和加上这个数的补码是一样的。

与十进制数的换算

可以很方便地将一个补码形式的符号数换算为十进制,而不需要先判断它是正数还是负数(如果用反码就需要判断,请自行查阅资料)。方法是,把所有为 1 的数值位相应的权加起来,其中符号位的权为负。以补码形式 10101010 为例:

一个实例

C 语言中,如果给 unsigned int(32位)类型赋值 -1,在用无符号方式输出它会得到什么呢?


unsigned ui = -1;
printf("%u", ui);

运行,发现结果为 4294967295。下面简述其原理。

我们知道计算机通过补码形式来储存符号数,-1 的补码为:


1111 1111 1111 1111 1111 1111 1111 1111

而通过转换说明符 %u 来输出时,认为这是一个无符号数,因此所有的 32 个比特均看作数值位,其数值是 2^32-1,十进制就是 4294967295。这种得到错误结果的现象称为溢出。

 

Jed

一名狂热的技术爱好者。

文章评论(6)

  • 颜修门

    话说你大几呀,以后可以关注你一波,毕竟坚持博客的人不多了。

    2018年6月29日
    • Jed

      现在大一 :razz: 欢迎关注~

      2018年6月29日
      • J2

        希望多更一些基础教程类文章哦

        2018年7月2日
        • Jed

          会的。欢迎持续关注本站噢

          2018年7月2日
  • ZAERA

    计算机组成原理? :idea:

    2018年6月27日
    • Jed

      是的,计组

      2018年6月27日
  • 提示:有人回复时会邮件通知您