わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

%02dは,「必ず2桁」ではない

いきなりですが問題です.次のプログラムは,何を出力するでしょうか.

#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型の取り得る値の数と一致します.