![](https://teratail.com/img/ogpImages/imgFacebookShare.png)
まず、
関数の戻り値が2バイトで戻ってこない。
「2バイト」と(16進で)「2桁」とは違います。16進2桁は1バイトです。
関数の戻り値の型はchar
なので1バイトで 0xea が返っています。
( sizeof changeKeyMap(key)
は1です)char
の値をprintf
の引数等の式の中などに書くと、char
⇒int
の自動型変換が起こります。
符号付きcharが符号付きintに変換される際に、符号ビット(下から8bit目)が上位バイトに延長されるので、
0xea が 0xffffffea 等になります。
解決策は、普通のやり方としては、関数返り値の宣言をchar
でなくunsigned char
にして、その値を扱う他の変数の宣言もunsigned char
にします。
何らかの事情で普通のやり方が出来ない場合は、どこかででキャストします。printf
の時点でキャストするなら、printf("%02X", (unsigned char)remap);
または、変換指定のX
の前に長さ指定のhh
(おそらくhalfのhalfの意)を付けて、引数の値のうち下位の1バイトだけ使うことを明示します。printf("%02hhX", remap);
。まあ、これは「他に手はないか?」と考えて思い出した物なので、普通は採用しないと思います。さらに他にはprintf("%02X", remap & 0xFF);
もありますね。
蛇足:
単にchar
と書くとsigned char
かunsigned char
のどちらの意味になるかは言語の規格では決まっていませんが、多くの処理系ではsigned char
のようです。(int
はsigned int
の意味に決まってます)
コンパイラによっては#pragma chars unsigned
等と書いて選択できる物もあるようです。
0 コメント