C言語関係掲示板

過去ログ

No707 char型変数を"%x"で表示すると

[戻る] [ホームページ]
No.8447

シフト演算
投稿者---入門編(2003/07/16 20:22:25)


どうしても理解できなかったので質問いたします。

文字「N」の16進表示「4e」を「e4」にするプログ
ラムを以下のように作成したのですが、実行結果が
 ffffffe4
となってしまいます。変数の宣言時に「unsigned」
をつければ正常な実行結果
 e4
が表示されます。
「b = a << 4」の時の「b」の値が
 ffffffe0
となっていることは判明したのですが、どうして左
シフトでこのような結果になってしまうのかが理解
できません。どなたか教えて頂けませんでしょうか。
右シフトすると空いたところに符号(1 or 0)が入る
算術シフトと何か関係があるのでしょうか。


#include<stdio.h>
int main(void)
{
  char a = 'N',b,c;
  b = a<<4;
  c = a>>4;
  a = b + c;

  printf("%x\n",a);
  return(0);
}

No.8448

Re:シフト演算
投稿者---とおりかかり(2003/07/16 20:36:31)


>「b = a << 4」の時の「b」の値が
> ffffffe0
>となっていることは判明したのですが、どうして左

e0でしょう? char なんだから
何か問題でも?


No.8451

Re:シフト演算
投稿者---YuO(2003/07/16 21:15:24)


>文字「N」の16進表示「4e」を「e4」にするプログ
>ラムを以下のように作成したのですが、実行結果が
> ffffffe4
>となってしまいます。

演算するときや,プロトタイプのない関数引数に渡す場合,
・signed char/short型はint型に変換
・unsigned char/unsigned short型はunsigned型に変換
という変換が行われます。プロトタイプのない関数引数に渡す場合,
・float型はdouble型に変換
という変換もあります。
これらの変換は,値を保持するように変換されます。

なので,
>  printf("%x\n",a);
は,
printf("%x\n", (unsigned char)a);
と,キャストを入れるとよいでしょう。

No.8454

Re:シフト演算
投稿者---nop(2003/07/16 21:44:56)


>printf("%x\n",a);

「%x」の書式で参照するのは「int」型の値のため、
暗黙の型変換が生じているためでしょう。
char の 0xE0 を int に型変換をすると、
マイナスの値として型変換が行われるのです。

No.8464

Re:シフト演算(解決?しました)結論報告_暇な方どうぞよろしく
投稿者---入門編(2003/07/17 13:15:01)


みなさんの意見を参考に「型変換」について調べてみた結果、なんとか
理解できた様な気がします。結論をまとめてみました。


今回のプログラムの問題点は、

printf("%x",a); ※変数aはchar型です。

で”%x”が変数aをint型に”暗黙の型変換”してしまう点だという事で
す。char(1バイト) を int(4バイト)にし、「符号拡張」により int
の残りの3バイトに変数aの先頭ビットである”1”が格納されるので、
実行結果が
 
 ffffffe4

となります。これを解決するには、変数aを”unsigned(符号無し)”
にし、「符号拡張」時に変数aの先頭ビットを符号であると認識さ
せないようにする必要があります。以上!!

 何か間違いがあれば訂正して頂たいです。よろしくお願いします。