C语言教程-C中的2s补码是什么?

在C语言中,二补数是通过一补数生成的。我们知道,二进制数的一补数是通过将1变为0,0变为1来创建的;而二进制数的二补数是在一补数的基础上加1得到的。
简而言之,我们可以说C语言中的二补数定义为一补数与1的和。
在上面的图中,二进制数等于00010100,它的一补数是通过将位1变为0,0变为1来计算的。因此,一补数变为11101011。在计算完一补数后,我们通过将1加到一补数上计算出二补数,其结果为11101100。
让我们创建一个二补数的程序。
#include <stdio.h>
int main()
{
int n; // 变量声明
printf("请输入要输入的位数:");
scanf("%d", &n);
char binary[n + 1]; // 二进制数组声明
char onescomplement[n + 1]; // 一补数数组声明
char twoscomplement[n + 1]; // 二补数数组声明
int carry = 1; // 变量初始化
printf("\n请输入二进制数:");
scanf("%s", binary);
printf("%s", binary);
printf("\n该二进制数的一补数为:");
// 计算一补数
for (int i = 0; i < n; i++)
{
if (binary[i] == '0')
onescomplement[i] = '1';
else if (binary[i] == '1')
onescomplement[i] = '0';
}
onescomplement[n] = '\0';
printf("%s", onescomplement);
printf("\n该二进制数的二补数为:");
// 计算二补数
for (int i = n - 1; i >= 0; i--)
{
if (onescomplement[i] == '1' && carry == 1)
{
twoscomplement[i] = '0';
}
else if (onescomplement[i] == '0' && carry == 1)
{
twoscomplement[i] = '1';
carry = 0;
}
else
{
twoscomplement[i] = onescomplement[i];
}
}
twoscomplement[n] = '\0';
printf("%s", twoscomplement);
return 0;
}
程序解析
1、首先,我们输入位数并将其存储在变量'n'中。
2、在输入位数后,我们声明字符数组char binary[n+1],用于存储二进制数。这里的'n'是我们在前一步中输入的位数,它确定了数组的大小。
3、我们还声明了两个数组,即onescomplement[n+1]和twoscomplement[n+1]。onescomplement[n+1]数组存储二进制数的一补数,twoscomplement[n+1]数组存储二进制数的二补数。
4、初始化carry变量,并将其赋值为1。
5、在声明后,我们输入二进制数。
6、现在,我们简单地计算二进制数的一补数。为此,我们创建一个循环,从二进制数组的第一个元素到最后一个元素进行迭代(for(int i=0;i<n;i++)。在循环中,我们检查条件以确定位是1还是0。如果位是1,则onescomplement[i]=0;否则onescomplement[i]=1。通过这种方式,生成了二进制数的一补数。
7、在计算一补数之后,我们计算二进制数的二补数。为此,我们创建一个循环,从最后一个元素到第一个元素进行迭代(for(int i=n-1;i>=0;i--)。在循环中,我们有三个条件:
- 如果onescomplement[i]的位为1且carry的值为1,则将0放入twoscomplement[i]。
- 如果onescomplement[i]的位为0且carry的值为1,则将1放入twoscomplement[i],并将carry置为0。
- 如果上述两个条件都不成立,则onescomplement[i]等于twoscomplement[i]。