
C言語初心者です。作成し実行した結果、問題の答えと異なる表示がされてしまいました。
どこを修正すればいいか、教えていただけると助かります。
環境は、Windows10、Visual Studio 2017です。
(問題)キーボードから、0から255までの整数を入力させ、その数値を二進数に変換するプログラムを作りなさい。なお、手順は、以下の通り行うこと。
(ヒント)
(1)入力された数値を、変数nに代入する。
(2)nと0x80の論理積を求める。
(2)(2)の計算の結果が0ならば、0を、それ以外なら、1を表示する。
(3)nの値を、左シフトする。
(4)nが0でなければ、(2)に戻る。
(5)nが0ならば、改行し、終了。
(期待される実行結果)
Input Number(0-255):35 ←キーボードから入力
00100011
(私が作成したもの↓)
#include<stdio.h>
void main(){
int n,ans;
printf("Input Number(0-255):");
scanf_s("%d", &n);
while (1) {
ans = n & 0x80;
if(ans==0){
printf("0");
}
else {
printf("1");
}
n <<= 1;
if (n == 0) {
printf("\n");
break;
}
}
}
(実行結果↓)
Input Number(0-255):35
00100011000000000000000000000000
※0がたくさん表示されてしまいます。。。

No.2ベストアンサー
- 回答日時:
No1の方の指摘でchar型にかえたとしても、このロジックでは正しく動作しません。
例 64を入力すると
01
と表示されるだけです。
そもそも、ヒントの(5)nが0ならば、改行し、終了。の部分が間違っています。
ヒントはようにあるべきです。
(1)入力された数値を、変数nに代入する。
(2)以下の処理を8回繰り返す。
(2-1)nと0x80の論理積を求める。
(2-2)(2-1)の計算の結果が0ならば、0を、それ以外なら、1を表示する。
(2-3)nの値を、左シフトする。
(3)改行を表示する。
上記に従って作成したソースです。
#include <stdio.h>
void main(){
int n,ans;
int i;
printf("Input Number(0-255):");
scanf_s("%d", &n);
for(i=0;i<8;i++) {
ans = n & 0x80;
if(ans==0){
printf("0");
}
else {
printf("1");
}
n <<= 1;
}
printf("\n");
}
たしかにそうですね。
本問題のヒントでは、64や32といった数値に対応しきれないですね。
ありがとうございます、勉強になりました。
No.3
- 回答日時:
>ちなみに以下の警告がでましたので
あーごめんなさいそこの修正も必要でしたね、すみません
hhdなんて指定子があるんですね...逆に知りませんでした...
一般的ではないと思いますが、動くならいいでしょうw
>解説していただけるとありがたいです。
解説といってもたいしたことではないのですが
int型は4バイトです(実行環境で変わるので必ず4バイトではないのでここは注意です)
なので35と入力すると
質問者さんの想像だと00100011が変数に入っていると思ったかもしれませんが
実際には00000000000000000000000000100011
と頭に0が沢山入っている状態なのです
00100011が1バイトなので残りの3バイト分0で埋められている状態ですね
これをシフト演算して計算していった結果
頭の0が後ろについてしまったわけです
ちょっとざっくりした回答ですけど
これで分かりますかね?
No.1
- 回答日時:
変数の型をchar型もしくはunsigend char型にしてみてください
必要なら解説しますが
とりあえずそれでちゃんと動くか確認してみてください
ありがとうございます。
char型に変更したところ、動かすことができました。
ちなみに以下の警告がでましたので、それも含めて変更したところ、正常に動かすことができました。(%hhdのところです。)
恐縮ですが、習得したいと考えています。差し支えなければ、解説していただけるとありがたいです。
1>------ ビルド開始: プロジェクト: Project13, 構成: Debug Win32 ------
1>probex3-3.c
1>c:\users\watan\source\repos\project13\probex3-3.c(6): warning C4477: 'scanf_s' : 書式文字列 '%d' には、型 'int *' の引数が必要ですが、可変個引数 1 は型 'char *' です
1>c:\users\watan\source\repos\project13\probex3-3.c(6): note: 書式文字列に '%hhd' を使用することをお勧めします
1>Project13.vcxproj -> C:\Users\watan\source\repos\Project13\Debug\Project13.exe
1>プロジェクト "Project13.vcxproj" のビルドが終了しました。
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
三角形の判別
-
テキストカーソル位置の取得
-
C言語
-
cshの文字列操作(0埋め)
-
勝率をプログラムに
-
c言語プログラミングでアルファ...
-
なぜgccはstdio.hをインクルー...
-
scanfに文字が入力されたときに...
-
エラーが出ます。
-
「Aに対するBの割合」と「Aに対...
-
Aの値からBの値を除するとは??
-
2曲同時再生するにはどうした...
-
ある商品のロス率を5%見込み、...
-
有効数字について 以前質問をし...
-
int16_t の _t は何?
-
fgetsについて
-
マイナスからプラスへ転じた時...
-
プログラムでの数字につく”f”の...
-
std::set<int> で、ある値が何...
-
c言語で、繰り返し文の中で、0....
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
c言語でAからZまでを表示する...
-
(C言語)めちゃくちゃな値にな...
-
コマンドラインに出力した文字...
-
コンパイルエラーについて
-
コマンドプロンプトがすぐ消える
-
勝率をプログラムに
-
テキストカーソル位置の取得
-
三角形の判別
-
【C言語教えてください】sin波...
-
4の倍数を論理演算で表す。。
-
C言語で、「自然数nを入力し、n...
-
入力したお金の金額からお札の...
-
cshの文字列操作(0埋め)
-
switch分のケースを範囲数?に...
-
scanfに文字が入力されたときに...
-
プログラミングについての質問です
-
unsigned int型について
-
ダブルポインタで2次元配列を作成
-
円の面積を求めるプログラミン...
おすすめ情報