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

If i enter a value above 16383 in this C program that converts decimal to binary, it doesn't work. Why?

这是一个十进制到二进制的转换器,用户输入一个十进制数并输出其二进制版本。它工作正常,除非输入数字(在此代码中显示为变量 '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();
}

检查您的整数的大小,它们可能是 16 位,我认为 16383 是适合带符号的 16 位整数的最大整数。

printf("%i",sizeof(int));

你是不是在 16 位机器上工作(sizeof(int)2)?

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

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

...会给出 0x8000,这会在 16 位机器上换成负值。

(以防万一你不熟悉 0x...,即 hexadecimal 符号,这样更容易看到位模式。)


intsigned 类型,即它可以容纳负数。在 most modern platforms 上,负数是设置了最高有效位的那些。对于 16 位机器是 0x8000-0xffff,对于 32 位机器是 0x80000000-0xffffffff

因此,越来越大的正数 (0x7ffe0x7fff) 可能会突然变小 负数 (0x8000)。如果您使用 unsigned 类型(即 unsigned int),您会得到从 "really large" 到 "zero" 的类似 "wraparound"。

在你的机器上,16383 乘以二是 32766。

但是 16384 乘以二(由于可以用 16 位表示的数字范围有限)实际上是 -2 -- 在这一点上你的程序中断了。