Fu-koの足跡

コンピュータが苦手です。得体のしれない感じに抵抗があります。考えるのは好きです。すっきりしたロジックに感動します。ちゃんと理解すれば好きになれるはずと信じて、その過程を残そうと思います。

printfでの16進表示(符号拡張)

ダンプ表示プログラムを書いていて、符号有無とprintfの型変換に引っかかったのでメモ。

■問題
2桁16進数指定なのに上位がF埋めされて、8桁表示される場合がある。

■原因
ファイルから読み込んだバッファをchar型配列に格納していた為。
printfで出力する際にint型に暗黙の型変換され、0x80~0xFFが負数として出力されていた。

■対策
バッファを格納する型をunsigned char型配列に変更。

■詳細
0xFFを格納した際の、charとunsigned charでの動作の違いは下記の通り。

  • char型の0xFFは「-1」. printfの第二引数はintなので渡すと上位3バイトがFFFFFFで埋められて「FFFFFFFF」が出力される。
  • unsigned char型の0xFFは「255」. printfに渡すと上位3バイトが「000000」で埋められるので「FF」が出力される。

[確認用ソース]

#include <stdio.h>

int main()
{
	char c = 0xFF;
	printf("%02X\r\n", c);

	unsigned char uc = 0xFF;
	printf("%02X\r\n", uc);
}

[実行結果]

FFFFFFFF
FF