- ベストアンサー
文字コードの出力について
- 符号付char型の変数で文字コードを出力するC言語プログラムの問題点について
- 問題の文字コード「N」の変換についての解決策
- 符号無しchar型の変数を使用する理由について
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
その出力には何を使ってますか? printf("%x",moji); のようにしているのでは無いでしょうか? printfのような不定長引数(引数がいくつあるか決まってないもの)の場合、char,shortはintに自動的に型変換されます。その際、char,shortの符号も考慮されます。 同じ0xE4でも signed char型の場合、 0xE4=-28 なので → intの-28に型変換→0xFFFFFFE4 (intが32bitの場合) unsigned char型の場合、 0xE4=228 なので → intの228に型変換→0xE4 となります。 解決策は次のようなものがあります ・unsigned charを使う ・printf("%x",moji & 0xff) ; 等として、下8bitだけを残す。 & の計算時にmojiはintへ型変換されます。 ・計算をintで行う 入力はchar型の変数mojiだとして、途中経過や結果はintを使う。 例えば、結果を入れる変数を int kekka とでもして printf("%x",kekka) ; なら期待通りになるはず。
その他の回答 (3)
- kmee
- ベストアンサー率55% (1857/3366)
一箇所訂正 > 計算をintで行う このときも char→intの拡張が発生するので int moji_int = moji ; などとするのではなく int moji_int = (unsigned char)moji ; int moji_int = moji & 0xff ; 等として、8ビットだけ有効にするのがよいでしょう。
お礼
大変勉強になりました。 ありがとうございました。
- asuncion
- ベストアンサー率33% (2127/6289)
ご質問とともに、書かれたソース「も」見せてくだされば、 ソースのどこに問題がありそうでどう修正すればよさそうかが 一発でわかるかもしれないんですが…。 なんか二度手間。
お礼
ご指摘ありがとうございました。
補足
これは大変失礼しました。 こちらになります。 なお、「moji」変数を符号無しchar型にすると解決します。 #include <stdio.h> void main(void) { char moji = 'N'; char MASK_A = 0xF0; char MASK_B = 0x0F; moji = ((moji & MASK_A) >> 4) | ((moji & MASK_B) << 4); printf("文字コード:%x\n", moji); }
- notnot
- ベストアンサー率47% (4900/10358)
符号ありの整数は、最上位ビットを符号ビットとみなします。右シフトした場合、最上位ビットを保存したままシフトします。 符号なし整数の場合は、右シフトすると最上位ビットにはゼロが入ってきます。
お礼
ご回答ありがとうございます。 「N」の文字コード「4E」は、「0100 1110」であり、上位4ビットの最上位ビットは「0」なので、算術右4シフトしても「0」を保持しますし、下位4ビットでは算術左4シフトなので、最下位ビットは「0」が入るかと思います。 表示は「ffffffe4」ですが、「f」を除けばe4と入れ替えしていることが分かります。 問題は、それ以降の「f」になりますが、「ffffffe4」が32bitで表示しているところも気になります。
お礼
大変勉強になりました。 ありがとうございました。