[解決済み] 10進数から2進数への変換を行うC言語プログラムにおいて、16383以上の値を入力すると、動作しません。なぜですか?
質問
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であり、この時点でプログラムは破綻してしまうのです。
関連
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み】組み込み関数「malloc」の暗黙の宣言の非互換性
-
[解決済み】"Expected expression before ' { ' token"(トークンの前に期待される式)。
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
-
[解決済み】シンプルなC言語のscanfが機能しない?重複
-
[解決済み] なぜGitはこのテキスト・ファイルをバイナリ・ファイルとして扱うのですか?
-
[解決済み] なぜ、このメモリイーターは本当にメモリを食べないのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"Expected expression before ' { ' token"(トークンの前に期待される式)。
-
[解決済み】C言語におけるファイルスコープでの可変長配列の変更
-
[解決済み】初期化がキャストなしで整数からポインタを作成 - C言語
-
[解決済み】警告。この関数ではXが初期化されていない状態で使用される可能性があります。
-
[解決済み】式は変更可能なL値でなければならない
-
[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
-
[解決済み] C: エラー: ';'トークンの前に ')' があると予想される
-
[解決済み] [Solved] .Cファイルをコンパイルしています。アーキテクチャ x86_64 の未定義シンボル
-
[解決済み】インクリメントオペランドとして lvalue が必要です。
-
[解決済み】C言語のフォーマット文字列でデータ引数が使用されない [重複]。