アプリ版:「スタンプのみでお礼する」機能のリリースについて

int型変数bに10進数として数値を入力し、その値を実行結果のように8進数と16進数で表示するプログラムを作成しなさい

という問題にとりかかっているのですが、いまいち理解できません
scanfで値を入力させる項目は必要とわかるのですが、その他がどうしてもわかりません、ご教授して頂ければ幸いです

A 回答 (5件)

★追記。


・8進数と16進数ってどんな数か分かりますか?
・8進数とは 0 ~ 7 までの数で 1 桁を表して 8 になったとき、桁上げされます。
 16進数とは 0 ~ 9、A ~ F までの数で 1 桁を表して 16 になったとき、桁上げされます。
・また、int 型の整数はコンピュータの内部では 2 進数で格納されています。
 入力が 10 進数であろうが、8進数、16進数であろうが内部表現では 2 進数で格納されています。
 これを利用すれば 8進数、16進数の表示はすごく簡単になりますよ。
    • good
    • 0

●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
    • good
    • 0

すでに指摘されているように、「実行結果のように」の実行結果が示されていないので正確なことは分かりません。


この問題のポイントは負の数をどう扱うかと、処理系が特定されていないので、規格厳密合致プログラムにするところですかね。

#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;
}

エラー処理は手抜きですが、こんな感じでしょうか?
もし学校の課題なら、このまま提出すればすぐにばれると思いますけど。
    • good
    • 0

「実行結果のように」はどのような結果かわからないので、


近いだろうとおもうプログラムを記述します。
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);
}
    • good
    • 1

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

    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!