関数の戻り値が2バイトで戻ってこない。

まず、

関数の戻り値が2バイトで戻ってこない。

「2バイト」と(16進で)「2桁」とは違います。16進2桁は1バイトです。

関数の戻り値の型はcharなので1バイトで 0xea が返っています。
sizeof changeKeyMap(key)は1です)
charの値をprintfの引数等の式の中などに書くと、charintの自動型変換が起こります。
符号付き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 charunsigned charのどちらの意味になるかは言語の規格では決まっていませんが、多くの処理系ではsigned charのようです。(intsigned intの意味に決まってます)
コンパイラによっては#pragma chars unsigned等と書いて選択できる物もあるようです。

コメントを投稿

0 コメント