整数の表現方法 解答ページ | Programming Place Plus C言語編 第18章

トップページC言語編第18章

問題①

問題① 標準入力から 16進数の整数を受け取り、それを 8進数で出力するプログラムを作成してください。


たとえば、次のようになります。

#include <stdio.h>

int main(void)
{
    char input_string[40];
    puts("Please enter the hexdecimal integer." );
    fgets(input_string, sizeof(input_string), stdin);
    unsigned int value;
    sscanf(input_string, "%x", &value);

    printf("Octal: %o\n", value);
}

実行結果:

Please enter the hexdecimal integer.
0xf0  <-- 入力した内容
Octal: 360

16進数で入力された整数を取り出すために、sscanf関数の変換指定子を %x にしています。また、受け取り用の変数 value の型は unsigned int です。

8進数として出力させるには、%o 変換指定子を使います。

問題②

問題② 8・10・16進数の対応表を表示するプログラムを作ってください。値の範囲は、10進数で「0~16」とします。


printf関数の変換指定子を活用すれば簡単です。

#include <stdio.h>

int main(void)
{
    for (int i = 0; i <= 16; ++i) {
        printf("%o %d %x\n", i, i, i);
    }
}

実行結果:

0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
10 8 8
11 9 9
12 10 a
13 11 b
14 12 c
15 13 d
16 14 e
17 15 f
20 16 10

出力結果が、やや不揃いな感じで美しくありませんが、これは printf関数の機能で調整することも可能です。変換指定子のところを、“%2d” のように 2 を割り込ませると、「最低でも 2桁分のスペースを使う」という意味になります。

#include <stdio.h>

int main(void)
{
    for (int i = 0; i <= 16; ++i) {
        printf("%2o %2d %2x\n", i, i, i);
    }
}

実行結果:

 0  0  0
 1  1  1
 2  2  2
 3  3  3
 4  4  4
 5  5  5
 6  6  6
 7  7  7
10  8  8
11  9  9
12 10  a
13 11  b
14 12  c
15 13  d
16 14  e
17 15  f
20 16 10

問題③

問題③ 次の式を手作業で計算してみてください。そして、答えを確認するためのプログラムを作成してください。
「0x3c5 × 26 - 0741」は 10進数でいくつ?


まずは手計算です。 異なる基数が混ざっている場合は、10進数にしてしまうのが簡単です。

まず、16進数の 0x3c5 は、「3*162 + c*161 + 5*160」ですから、「3*256 + 12*16 + 5*1」となり、結果は 965 です。

次に、8進数の 0741 は、「7*82 + 4*81 + 1*80」ですから、「7*64 + 4*8 + 1*1」となり、結果は 481 です。

したがって、「0x3c5 × 26 - 0741」は、 「965 × 26 - 481」となり、24609 が答えです。


続いて、この結果を確認するためのプログラムを作成します。これは単純に次のように作ればいいでしょう。

#include <stdio.h>

int main(void)
{
    printf("%d\n", 0x3c5 * 26 - 0741);
}

実行結果:

24609

正しいことが確認できました。

問題④

問題④ 2進数の 0111101 を 10進数と 16進数に変換してください。


2進数から 10進数へ変換します。

「26 * 0 + 25 * 1 + 24 * 1 + 23 * 1 + 22 * 1 + 21 * 0 + 20 * 1」です。つまり、「32 + 16 + 8 + 4 + 1」なので、61 になります。

10進数に変換できれば、ここから 16進数へ変換できます。10進数から n進数への変換に際には、変換後の基数で割る操作を繰り返します。

16)61
16) 3・・・13(D)
  ) 0・・・3

余りを下から上へ向かって読んでいけば、結果は 3D だと分かります。


参考リンク


更新履歴

’2018/6/5 第19章から移動してくる形で新規作成。



第18章のメインページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る