1. ホーム
  2. c

[解決済み] 10進数から2進数への変換を行うC言語プログラムにおいて、16383以上の値を入力すると、動作しません。なぜですか?

2022-02-10 01:29:01

質問

10進数から2進数への変換器で、ユーザーが10進数を入力すると、その2進数が出力されます。入力された数値(このコードでは変数 'a' として示されている)が16383より大きいときを除いてはうまく動作しています。理由はよくわからない。もう一つ不思議なのは、16383を入力番号として使用した場合、2進数出力は単に長い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ビットマシン( sizeof(int)2 )?

なぜなら、16383は 0x3fff . もうひとつは 0x4000 で、これを2倍にすると...

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

...すると、次のようになります。 0x8000 16bitのマシンでは負の値に折り返してしまいます。

(念のため 0x... ということです。 十六進法 という表記で、ビットパターンが見やすくなっています)。


int サイン入り 型,すなわち負の数を保持することができる。また ほとんどの最新プラットフォーム ネガとは、最上位ビットがセットされているものを指します。その場合 0x8000-0xffff は16ビット機で、そして 0x80000000-0xffffffff を32bitマシンで使用する場合。

そのため、これまでより大きな正の数( 0x7ffe , 0x7fff ) が突然小さくなることがある ネガティブ の数値( 0x8000 ). もし、あなたが 無記名 型(すなわち unsigned int のように、quot;large" から zero" まで、同じように回り込むことができます。

あなたのマシンでは、16383の2倍が32766です。

しかし、16384×2は(16ビットで表現できる数値の範囲が限られているため)実際には-2であり、この時点でプログラムは破綻してしまうのです。