这里我们以十进制数+12和-12为例,解释C语言中的 真值、原码、补码、反码 概念。先来一点补充前提:
- C语言中,数字有 int、float、double类型,占内存分别为2、4、8个字节。这里我们讨论的是2个字节16位的情况
- 12就是+12,只是一般表示正数的时候我们省略+号
- 十进制数12,转为二进制为1100
- 数位值原码=反码=补码
- 计算机中所有整数类型都是以补码形式储存的,原码和反码是为了方便解释补码而引入的两个概念。
一、真值
顾名思义,对于这个案例而言,真值就是+12和-12.
二、原码
把12的二进制表示(1100)如下放在这16个格子里:
注意第一位是符号位,正数用0表示。
而对于-12,符号位是1:
三、反码
如果是正数,反码就跟原码一样:
- 12的原码:
- 12的反码:
如果是负数,在原码基础上,数位值取反(即除了符号位,所有0变成1,1变成0):
- -12的原码:
- -12的反码:
四、补码
正数在反码的基础上不变(也就是,正整数的原码、反码、补码是相同的)。
- 12的原码、反码、补码:
负数要在反码的基础上+1(注意二进制表示满2要进位):
- -12的原码、反码、补码:
PS:为什么要做这些变换?——为了对正、负数都能进行正常的运算。