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() 函数,即使是在一个小测试程序中也不行。这是一个真正可怕、危险的功能。