- 締切済み
8進数と16進数で表示するプログラム
int型変数bに10進数として数値を入力し、その値を実行結果のように8進数と16進数で表示するプログラムを作成しなさい という問題にとりかかっているのですが、いまいち理解できません scanfで値を入力させる項目は必要とわかるのですが、その他がどうしてもわかりません、ご教授して頂ければ幸いです
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- Oh-Orange
- ベストアンサー率63% (854/1345)
★追記。 ・8進数と16進数ってどんな数か分かりますか? ・8進数とは 0 ~ 7 までの数で 1 桁を表して 8 になったとき、桁上げされます。 16進数とは 0 ~ 9、A ~ F までの数で 1 桁を表して 16 になったとき、桁上げされます。 ・また、int 型の整数はコンピュータの内部では 2 進数で格納されています。 入力が 10 進数であろうが、8進数、16進数であろうが内部表現では 2 進数で格納されています。 これを利用すれば 8進数、16進数の表示はすごく簡単になりますよ。
- Oh-Orange
- ベストアンサー率63% (854/1345)
●10進数で 123 は 2進数で 1111011 です。 8進数の場合は 3 ビットずつに区切り 001 111 011 となります。 16進数の場合は 4 ビットずつに区切り 0111 1011 となります。 上記の区切られた 3 ビットや 4 ビットがそのまま 0~7 や 0~15 の数値になります。 その数値を文字の '0'~'7' や '0'~'9'、'A'~'F'で出力すればよい。 参考サンプル: static unsigned char table[] = "0123456789ABCDEF"; int b = 123; ←10進数で入れる変数(scanfなどで入力するように) /* 8進数の場合 */ putchar( table[ (b >> 3*10) & 0x7 ] ); ←最上位1桁 putchar( table[ (b >> 3*9) & 0x7 ] ); : putchar( table[ (b >> 3*2) & 0x7 ] ); putchar( table[ (b >> 3*1) & 0x7 ] ); putchar( table[ (b >> 3*0) & 0x7 ] ); ←最下位1桁 /* 16進数の場合 */ putchar( table[ (b >> 4*7) & 0xF ] ); ←最上位1桁 putchar( table[ (b >> 4*6) & 0xF ] ); : putchar( table[ (b >> 4*2) & 0xF ] ); putchar( table[ (b >> 4*1) & 0xF ] ); putchar( table[ (b >> 4*0) & 0xF ] ); ←最下位1桁 解説: ・上記のサンプルではビットの上位から 3ビット(4ビット)ずつを 8/16進数の数値として 1桁ずつの数字文字で出力しています。分かりやすくするために繰り返し文は使って いません。また、『3*0』~『3*10』の 3 が 8 進数を表すビット長の 3 ビットです。 『4*0』~『4*7』の 4 も 16 進数を表すビット長の 4 ビットとなります。 ・あと『0x7』や『0xF』というのは 3ビット、4ビットでマスクして 1 桁を取り出すビット 演算です。上記のサンプルを理解するには『ビット』や『ビット演算』をちゃんと理解 する必要があります。 ・もし、ビット演算が分からない場合は、 8 進数なら 8 で割ったあまりを取り出していけば 0~7 で取り出せます。 16 進数なら 16 で割ったあまりを取り出していけば 0~15 で取り出せます。 この出てきた数を数字文字(0~9)、英字文字(A~F)に変換すればよいだけです。 ・以上。おわり。
- jacta
- ベストアンサー率26% (845/3158)
すでに指摘されているように、「実行結果のように」の実行結果が示されていないので正確なことは分かりません。 この問題のポイントは負の数をどう扱うかと、処理系が特定されていないので、規格厳密合致プログラムにするところですかね。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> #include <errno.h> int main() { long a; int b; char s[sizeof(int)*CHAR_BIT/3+2]; char *endptr; if (fgets(s, sizeof(s), stdin) == NULL) goto fail; errno = 0; a = strtol(s, &endptr, 10); if (errno != 0 || *endptr != '\n' || a < INT_MIN || INT_MAX < a) goto fail; b = a; if (b < 0) { unsigned int c = -(unsigned int)b; printf("-%#o -%#x\n", c, c); } else { printf("%#o %#x\n", b, b); } return EXIT_SUCCESS; fail: fputs("error\n", stderr); return EXIT_FAILURE; } エラー処理は手抜きですが、こんな感じでしょうか? もし学校の課題なら、このまま提出すればすぐにばれると思いますけど。
- laughsheep
- ベストアンサー率50% (11/22)
「実行結果のように」はどのような結果かわからないので、 近いだろうとおもうプログラムを記述します。 printfの第一引数をごらんください。 %oが8進数、%xが16進数です。%Xにすると16進数のA~Fが大文字になります。 #include <stdio.h> int main(int argc, char* argv) { int n; scanf("%d", &n); printf("8進数=%o 16進数=%x\n", n, n); }
- zone29
- ベストアンサー率53% (71/132)
printfの変換指定子を調べてみてはいかがでしょうか?