A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
★追記。
・8進数と16進数ってどんな数か分かりますか?
・8進数とは 0 ~ 7 までの数で 1 桁を表して 8 になったとき、桁上げされます。
16進数とは 0 ~ 9、A ~ F までの数で 1 桁を表して 16 になったとき、桁上げされます。
・また、int 型の整数はコンピュータの内部では 2 進数で格納されています。
入力が 10 進数であろうが、8進数、16進数であろうが内部表現では 2 進数で格納されています。
これを利用すれば 8進数、16進数の表示はすごく簡単になりますよ。
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
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);
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Ruby プログラミング 3 2023/06/09 14:30
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- Java Java 配列<選挙> 4 2023/07/31 15:07
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
干支のプログラム
-
charでの計算?
-
charからLPTSTRへの変換方法
-
atoi( ) の反対をやりたい
-
配列をnビットシフトする
-
c++ 文字列を入力して、一文字...
-
文字列から空白を取り除きたい...
-
3桁区切(コンマ)記号をつけ...
-
ftoa の作り方
-
コンパイルエラー invalid ope...
-
int main()の・・・
-
CStringをwchar_tに変換したい
-
strncpyと_tcsncpy_sのヌルの扱...
-
switch文で文字を比較すること...
-
C言語のfor文です。 繰り返しの...
-
間接参照のレベルが異なっています
-
for文 アスタリスクで形を作る
-
フルパスのファイル名からフォ...
-
C言語 ミリ秒を日付に変換には
-
Win32APIでのエディットボック...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
'const char *' 型は 'char *' ...
-
型変換
-
テキストデータをそのままバイ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
絶対パスからのファイル名の切...
-
fgetsなどのときのstdinのバッ...
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
3桁区切(コンマ)記号をつけ...
-
atoi( ) の反対をやりたい
-
double型の値をchar配列に変換...
-
C言語のfor文です。 繰り返しの...
-
switch文で文字を比較すること...
-
ファイル名である文字列からbas...
-
c++ 文字列を入力して、一文字...
-
strncpyと_tcsncpy_sのヌルの扱...
おすすめ情報