C程序求补码
C program to find two's compliment
我在一本书上看到了一个求二进制数补码的C代码。我不熟悉二进制数的一个和两个补码的概念,所以我进行了彻底的研究,现在对相同的概念有了一定的了解。但我对代码的工作原理仍有一些疑问。代码如下(注释在原代码中没有,是我加的,有错可以指正)-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
char a[16]; /*declaring an array to hold the binary number string*/
int i, j, k, len; /*len is the length of the string*/
printf ("Enter a binary number: ");
gets (a); /*reads the input string*/
len= strlen(a); /*calculates length of string*/
for (k=0; a[k]!='[=10=]';k++) /*to check if its a valid binary number or not*/
{
if (a[k] != '0' && a[k]!='1')
{
printf ("\nIncorrect Binary format...this program will quit");
exit(0);
}
}
for (i=len-1; a[i]!='1'; i--) /* An empty for loop*/
;
for (j=i-1; j>=0; j--) /*checks from right to left if the bit is 0 or 1*/
{
if (a[j]=='1')
a[j]= '0'; /*if the bit is 1, its converted to 0*/
else
a[j]= '1'; /*if the bit is 0, its converted to 1*/
}
printf ("\n2's compliment = %s", a);
}
代码工作得很好,但我对如何工作有疑问。
首先,我不完全理解空循环的作用。直到我们遇到从右边开始的第一个零才算数吗?
其次,在第三个也是最后一个 for 循环中,我们只是将每个位的值从 1 翻转到 0,然后从 0 翻转到 1。但是我们这样做是为了一个的补码,而不是二进制的补码,对吧?我们需要将一个的补码加 1 来找到二进制的补码。代码似乎没有在任何地方这样做。那它是如何工作的?
请指正,在此先感谢。
First, I don't exactly understand what the empty for loop does.
就是找到最右边的1
赋值给i
。
Second, in the third and last for loop, we just flip the value of each
bit from 1 to 0 and from 0 to 1.
翻转起始索引i-1
的所有位。
我在我的微处理器课程中学会了这个技巧。它是从右到左开始读取位,直到看到第一个位1
。不要翻转它。之后,翻转所有位。
我们来试试,10110 -> 01010
- 从右边开始。
- 阅读
0
,不是1。继续,
- 读取
1
,是的,我们得到第一位是1
。不要翻转它。
- 阅读
1
,翻阅。现在是 0
.
- 阅读
0
,翻阅。现在是 1
.
- 阅读
1
,翻阅。现在是 0
.
我们得到01010
程序的逻辑正是我所说的
通常为了计算补码,我们将所有的 1 变为 0,将所有的 0 变为 1,然后加 1。
让我们看一下 172 的补码,即二进制 10101100:
10101100
01010011 /* change all 0's to 1's and 1's to 0's */
01010100 /* add one */
请注意,当我们加 1 时,我们将一些 1 变回了 0。事实上,原始数字右边缘的所有 0 都保持为 0。原始数字中最右边的 1 保持为 1。实际上只有最右边 1 左边的 1 和 0 被交换了.
这就是原始程序中神秘循环的作用。它从右边开始扫描,跳过 0 直到找到第一个 1,实际上它只交换该点左边的数字。变量 i
最终保持最右边 1 的位置,然后下一个循环,即实际进行交换的循环,从 j = i - 1
.
开始
还有一件事:很抱歉唠叨这个,你可能已经知道了,但你真的不应该使用 gets()
函数,即使是在一个小测试程序中也不行。这是一个真正可怕、危险的功能。
我在一本书上看到了一个求二进制数补码的C代码。我不熟悉二进制数的一个和两个补码的概念,所以我进行了彻底的研究,现在对相同的概念有了一定的了解。但我对代码的工作原理仍有一些疑问。代码如下(注释在原代码中没有,是我加的,有错可以指正)-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
char a[16]; /*declaring an array to hold the binary number string*/
int i, j, k, len; /*len is the length of the string*/
printf ("Enter a binary number: ");
gets (a); /*reads the input string*/
len= strlen(a); /*calculates length of string*/
for (k=0; a[k]!='[=10=]';k++) /*to check if its a valid binary number or not*/
{
if (a[k] != '0' && a[k]!='1')
{
printf ("\nIncorrect Binary format...this program will quit");
exit(0);
}
}
for (i=len-1; a[i]!='1'; i--) /* An empty for loop*/
;
for (j=i-1; j>=0; j--) /*checks from right to left if the bit is 0 or 1*/
{
if (a[j]=='1')
a[j]= '0'; /*if the bit is 1, its converted to 0*/
else
a[j]= '1'; /*if the bit is 0, its converted to 1*/
}
printf ("\n2's compliment = %s", a);
}
代码工作得很好,但我对如何工作有疑问。
首先,我不完全理解空循环的作用。直到我们遇到从右边开始的第一个零才算数吗?
其次,在第三个也是最后一个 for 循环中,我们只是将每个位的值从 1 翻转到 0,然后从 0 翻转到 1。但是我们这样做是为了一个的补码,而不是二进制的补码,对吧?我们需要将一个的补码加 1 来找到二进制的补码。代码似乎没有在任何地方这样做。那它是如何工作的?
请指正,在此先感谢。
First, I don't exactly understand what the empty for loop does.
就是找到最右边的1
赋值给i
。
Second, in the third and last for loop, we just flip the value of each bit from 1 to 0 and from 0 to 1.
翻转起始索引i-1
的所有位。
我在我的微处理器课程中学会了这个技巧。它是从右到左开始读取位,直到看到第一个位1
。不要翻转它。之后,翻转所有位。
我们来试试,10110 -> 01010
- 从右边开始。
- 阅读
0
,不是1。继续, - 读取
1
,是的,我们得到第一位是1
。不要翻转它。 - 阅读
1
,翻阅。现在是0
. - 阅读
0
,翻阅。现在是1
. - 阅读
1
,翻阅。现在是0
.
我们得到01010
程序的逻辑正是我所说的
通常为了计算补码,我们将所有的 1 变为 0,将所有的 0 变为 1,然后加 1。
让我们看一下 172 的补码,即二进制 10101100:
10101100
01010011 /* change all 0's to 1's and 1's to 0's */
01010100 /* add one */
请注意,当我们加 1 时,我们将一些 1 变回了 0。事实上,原始数字右边缘的所有 0 都保持为 0。原始数字中最右边的 1 保持为 1。实际上只有最右边 1 左边的 1 和 0 被交换了.
这就是原始程序中神秘循环的作用。它从右边开始扫描,跳过 0 直到找到第一个 1,实际上它只交换该点左边的数字。变量 i
最终保持最右边 1 的位置,然后下一个循环,即实际进行交换的循环,从 j = i - 1
.
还有一件事:很抱歉唠叨这个,你可能已经知道了,但你真的不应该使用 gets()
函数,即使是在一个小测试程序中也不行。这是一个真正可怕、危险的功能。