如果我在此C程序中输入一个大于16383的值,将十进制转换为二进制,则它不起作用.为什么?

-1 c memory variables binary

这是一个十进制到二进制的转换器,用户输入一个十进制数,并输出其二进制版本.它工作正常,除非输入数字(在此代码中显示为变量'a')大于16383.我不太清楚为什么.另一个奇怪的事情是,当16383用作输入数字时,二进制输出只是1的长序列.不确定这是否是答案的线索.

无论如何,这是代码:

#include<stdio.h>
#include<conio.h>

void main()
{
  clrscr();
  int a,x=1;

  printf("Enter your number in base 10:");
  scanf("%d",&a);//max value:16383 for some reason??

  while(x<=a)
  {
    x=x*2;
  }

  x=x/2;
  printf("\nBinary version:");

  if(x==1)
    printf("1");
  else
  {
    while(x>=1)
    {
      if(a/x==1)
      {
        printf("1");
        a=a-x;
      }
      else
        printf("0");

      x=x/2;
    }
  }

  getch();
}
Run Code Online (Sandbox Code Playgroud)

Dev*_*lar 6

你,不管怎样,一个16位的机器上工作(这里sizeof(int)2)?

因为16383是0x3fff.还有一个是0x4000,在这里加倍时...

while(x<=a)
{
    x=x*2;
}
Run Code Online (Sandbox Code Playgroud)

...会给出0x8000,这将在16位机器上包含负值.

(以防你不熟悉0x...,这是十六进制表示法,这使得更容易看到位模式.)


int签名类型,即它可以保留负数.在大多数现代平台上,底片是具有最重要位设置的底片.那将是0x8000-0xffff16位机器和0x80000000-0xffffffff32位机器.

因此,越来越大的正数(0x7ffe,0x7fff)可能突然变成小的负数(0x8000).如果您使用的是无符号类型(即unsigned int),则会从"非常大"到"零"获得类似的"环绕".

在你的机器上,16383次两次是32766.

但16384次两次(由于有限的数字范围,可以用16位表示)实际上是-2 - 此时您的程序会中断.