質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

3回答

2789閲覧

2桁の16進数を各々でアスキーコードに変換する方法について

sakubou

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

1クリップ

投稿2020/08/22 09:10

下記のアスキーコードを16進データとして加算し、
一桁目と二桁目を別々の値をアスキーコードで表示するコードを教えてください。
使用言語はC言語です。

【たとえ】
37H+37H=6EH 
6Eを1桁ずつに分け、'6''E'にする。
各数値をアスキーコードにする。
’6’⇒36H
’E’⇒45H

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2020/08/22 21:10 編集

>16進データ・・・の意味が分かりません。数値は数値です。文字とは別物です。 16進というのは、数値(ビットパターン)を人間が見やすくするための表現方法です。 ちなみに、0x37は、ASCIIで'7'です。
thkana

2020/08/22 12:18

> 0x37+0x37=0x4Aですが? >python -c print(hex(0x37+0x37)) 0x6e
cateye

2020/08/22 21:09 編集

あ!・・・ごめんなさい 訂正します。
guest

回答3

0

「アスキーコード」と「16進数」と「10進数」と「変数のデータ」という全く別の者たちがあってそれぞれの間を変換する、とか考えてないでしょうか。

変数のデータ(数値)があって、それをどのように表示するか、その表し方が「10進数」、「16進数」だったりして、数値の意味が「アスキーコード(あるいは他の文字コード)」であったり何らかの数であったりするだけです。

なので、

下記のアスキーコードを16進データとして加算し、

これは単に「2つの数値を加算」するということ。
加算した結果を16進数としてアスキーコード並びに変換(つまり「数字」にする)し、その一文字ずつの値(別にアスキーコードは16進数で表記するという決まりもない)をそれぞれ表示する、というのがお題ということでしょう。

C

1 int a=55; //0x37と書いても'7'と書いても同じこと 2 int b=55; 3 char sum[10];//一応intが4byteの場合考えられる最大値分 4 sprintf(sum, "%02X",a+b);//もし結果が0x10以下だったら16^1の位は0とする

とすれば、
sum[0]とsum[1]にそれぞれ'6'すなわち54あるいは0x36と'E'すなわち69あるいは0x45が得られるでしょう。16進数で表示したいなら、
printf("%x %x",sum[0],sum[1]);
とすればよいのでは。

投稿2020/08/22 11:31

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hana_yama_san

2020/08/22 11:54

手元の実行結果はまさに「お題」通りになりました。 [user@host]c-work/work> cat hex2.c #include<stdio.h> #include<stdlib.h> int main(void) { int a=55; //0x37と書いても'7'と書いても同じこと int b=55; char sum[10];//一応intが4byteの場合考えられる最大値分 sprintf(sum, "%02X",a+b);//もし結果が0x10以下だったら16^1の位は0とする printf("%x %x",sum[0],sum[1]); } [user@host]c-work/work> [user@host]c-work/work> clang hex2.c -o HEX2 CORRECT>clang hex2.c -o HEX (y|n|e|a)? いいえ [user@host]c-work/work> [user@host]c-work/work> ./HEX2 36 45[user@host] これって、だから何なんでしょうか。
thkana

2020/08/22 12:11

> これって、だから何なんでしょうか。 学習初期の課題にいちいち「だから何」を求めても仕方ないと思いますが。 私は、「データの意味と表記」について整理させる課題(少なくとも質問者はそれで混乱している)と受け取って、それを強調する回答にしました。それが整理されていればプログラム部分は単なる足し算と凝った表示でしかないですから。 質問者に目的の追記を依頼したらいかがですか。それ用の記入欄がありますから。(出題者の意図を質問者が正しく受け取れているかどうかはまた別の話ですが) 他の回答者に問うことではないと思います。
hana_yama_san

2020/08/22 12:56

>>他の回答者に問うことではないと思います。 おっしゃる通りです。失礼致しました。
guest

0

例えば、こんな感じ?

C

1 char hexStr1[] = "37"; 2 char hexStr2[] = "45"; 3 long val1 = strtol(hexStr1, NULL, 16); 4 long val2 = strtol(hexStr2, NULL, 16); 5 int val = (int)(val1 + val2); 6 char valStr[20]; 7 sprintf(valStr, "%02X", val); 8 9 printf("%s + %s = %s\n", hexStr1, hexStr2, valStr); 10

投稿2020/08/22 10:01

編集2020/08/22 11:58
pepperleaf

総合スコア6385

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hana_yama_san

2020/08/22 11:07 編集

warningが報告されます。 × sprintf(valStr, "%02X", val); ○ sprintf(valStr, "%02lX", val); ま、結果は「37 + 45 = 7C」という単なる和算で、 質問者の意図したものかどうか私には判りませんですが。 追記:本当に質問の意図が判りません、なので回答者さんの 回答を注目しているのですが、ますます混沌としてゆきます。
pepperleaf

2020/08/22 12:01

Visual Studio2019(clコマンド)では、文句なかったですが、一応、キャスト。 確かに質問がよく分からないのですが、こんなものかと思って、、。
hana_yama_san

2020/08/22 12:01

valがintなら問題ないですね。キャストもしてますし・・
guest

0

printf("%02X",0x6e);
でどうでしょう


まじめに変換するのであれば、

C

1#define TOHEX(x) (((x)&0xf)+((x)&0xf)>9?('A'-10):'0'))

というマクロでどーでしょう

投稿2020/08/22 09:22

編集2020/08/22 11:38
y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問