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