• 締切済み

8進数と16進数で表示するプログラム

int型変数bに10進数として数値を入力し、その値を実行結果のように8進数と16進数で表示するプログラムを作成しなさい という問題にとりかかっているのですが、いまいち理解できません scanfで値を入力させる項目は必要とわかるのですが、その他がどうしてもわかりません、ご教授して頂ければ幸いです

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★追記。 ・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)
回答No.4

●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)に変換すればよいだけです。 ・以上。おわり。

参考URL:
http://www9.plala.or.jp/sgwr-t/c/sec14.html
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

すでに指摘されているように、「実行結果のように」の実行結果が示されていないので正確なことは分かりません。 この問題のポイントは負の数をどう扱うかと、処理系が特定されていないので、規格厳密合致プログラムにするところですかね。 #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; } エラー処理は手抜きですが、こんな感じでしょうか? もし学校の課題なら、このまま提出すればすぐにばれると思いますけど。

回答No.2

「実行結果のように」はどのような結果かわからないので、 近いだろうとおもうプログラムを記述します。 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)
回答No.1

printfの変換指定子を調べてみてはいかがでしょうか?

関連するQ&A