printfでchar型の値を2桁の16進数で出力する

C言語で1バイト単位で数値を扱うためにchar型を使用した.その時にprintfで2桁の16進数として出力しようとすると0x80を以上の値は以下のプログラムだとうまくいかない.

#include <stdio.h>

int main(){
  int i = 0;
  char str[] = {'a', 'z', 0xCC, 0x34, 0x80, 0x7F '\0'};

  for(i = 0; str[i] != '\0'; i++){
    printf("0x%02X ", str[i]);
  }
  return 0;
}

実行結果

0x61 0x7A 0xFFFFFFF8 0x34 0xFFFFFF80 0x7F 

こんな感じで4バイト表記になってしまう.
これは(多分)char型の値域は-128〜127なので,str[i]が負数扱いになってその後4バイトにキャストされているのが原因じゃないかと予測.
というわけで一旦符号なしの整数(unsigned int)にキャストしてやることで解決,すると思いきや先と同じ結果に.
どうやらunsigned intの値域に負数はないなので結局同じ結果になってしまうようだ.
しかたないので負数のデータサイズ拡張時には拡張されたビットは全て1で埋められるので,以下のようにして解決した.

#include <stdio.h>

int main(){
  int i = 0;
  char str[] = {'a', 'z', 0xCC, 0x34, 0x80, 0x7F, '\0'};

  for(i = 0; str[i] != '\0'; i++){
    printf("0x%02X ", str[i] & 0x000000FF);
  }
  return 0;
}

実行結果

0x61 0x7A 0xCC 0x34 0x80 0x7F 

なんかもっと良い解決方法がある気がする.