首页 > 编程知识 正文

原码反码补码的关系,原码反码补码的计算公式

时间:2023-05-03 18:22:56 阅读:219874 作者:4701

原码、反码和补码(适用于初学者)

文章目录 原码、反码和补码(适用于初学者)一、首先介绍概念二、具体情况1.下面看看这道例题2.正确解答


一、首先介绍概念

1.原码
原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。比如如果是8位二进制:

[+1](原码) = 0000 0001

[-1](原码) = 1000 0001

第一位是符号位,其中1代表负数,0代表正数。因为第一位是符号位,所以8位二进制数的取值范围就是:

[1111 1111 , 0111 1111]

[-127 , 127]

原码是人脑最容易理解和计算的表示方式。

2.反码
反码的表示方法是: 正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。

[+1] = [00000001](原码)= [00000001](反码)

[-1] = [10000001](原码)= [11111110](反码)

可见如果一个反码表示的是负数,人脑无法直观的看出来它的数值。通常要将其转换成原码再计算。

3.补码
补码的表示方法是:正数的补码就是其本身,负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1 (即在反码的基础上+1)。

[+1] = [00000001](原码) = [00000001](反码) = [00000001](补码)

[-1] = [10000001](原码) = [11111110](反码) = [11111111](补码)

对于负数,补码表示方式也是人脑无法直观看出其数值的。通常也需要转换成原码在计算其数值。

二、具体情况 1.下面看看这道例题 #include<stdio.h>int main(){int a=0;int b=~a;printf("%dn", b);return 0;}

很多小伙伴是这样认为的:
int型的a是4个字节也就是32个bit位

b是a按位取反得到
a 00000000 00000000 00000000 00000000
b 11111111 11111111 11111111 11111111
那么打印输出的是2^32-1 运行发现结果并不是想象的那样

2.正确解答 #include<stdio.h>int main(){int a=0;int b=~a;printf("%dn", b);//打印的是这个数的原码return 0;}

负数在内存中存储的时候,存储的是二进制补码
(第一位为符号位1表示负数,0表示正数)

也就是b表示补码 11111111 11111111 11111111 11111111
这时要通过补码求出原码
补码-1—>反码 即 11111111 11111111 11111111 11111110
反码符号位不变 其余按位取反—>原码
10000000 00000000 00000000 00000001 即为-1

printf打印的是这个数的原码,所以答案为-1


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。