いきなりですが問題です.次のプログラムは,何を出力するでしょうか.
#include <stdio.h> int main(void) { int x = 133; printf("%02d\n", x); return 0; }
さっそくですが解答です.出力は「133」です.プログラム中の「%02d」について,そのxの値では,「%d」と同じになります.Man page of PRINTFで「もし変換結果がフィールド幅よりも広かった場合、 フィールドは変換結果が入る幅に広げられる。」と書かれた件が関連します.
xの値が3であれば,出力は「03」となってくれます.ですので,printfの第1引数の中で,「%02d」と書いたら,これは「必ず2桁」ではなく,「最低2桁」と認識するのがよいでしょう.
さらにですが問題です.次のプログラムは,何を出力するでしょうか.
#include <stdio.h> int main(void) { char x = 133; printf("%02x\n", x); return 0; }
これは処理系に依存します.手元の環境では「ffffff85」と出力しました.
charはsigned char(符号あり)と同じであり,2の補数に基づいてこの変数のとる範囲が-128から127までのため,xに133という整数値をそのまま,代入することができませんでした.
ともあれ格納された値について,「%02x」というフォーマット,すなわち「16進2桁保証」で出力すると,「ffffff85」になったという次第です.
ちなみにこの16進表記は,符号も考慮して10進整数値にすると,-123になります.「printf("%02d\n", x);」より確認できます*1.
char型の変数の値を,16進で必ず2桁で出力させたい,133なら「85」,3なら「03」にしたい,という場合には…何通りか方法がありますが,来年度の授業にも使用したいので,解答はここに書かないことにします.
*1:133−(-123)=256です.256は2の8乗であり,char型の取り得る値の数と一致します.