『Cプログラミング専門課程』目次第4章メモリ

4.4 型の変換 (2)


トラブルは、次のプログラムで起きます。

サンプルプログラム

   1: /*  promote1.c  --  整数演算の格上げ  */
   2: 
   3: #include        <stdio.h>
   4: 
   5: main()
   6: {
   7:         unsigned long   ul;
   8:         long            sl;
   9:         unsigned char   uc;
  10:         signed char     sc;
  11:         int             a;
  12:         unsigned long   u_l;
  13: 
  14:         uc = 255;
  15:         sc = -128;
  16: 
  17:         a = sc * sc;
  18:         printf( "sc(-128)*sc(-128) = %d\n", a ); 
  19:         a = uc * uc;
  20:         printf( "uc(255)*uc(255) = %d\n", a ); 
  21: 
  22:         sc = -10;
  23:         sl = -5;
  24:         ul =  10;
  25: 
  26:         if( sc > sl )
  27:                 printf( "sc(-10) > sl(-5)\n" );
  28:         else
  29:                 printf( "sc(-10) <= sl(-5)\n" );
  30: 
  31:         if( sc > ul )
  32:                 printf( "sc(-10) > ul(10)\n" );
  33:         else
  34:                 printf( "sc(-10) <= ul(10)\n" );
  35: 
  36:         u_l = sc / ul * sc;
  37:         printf( "sc(-10)/ul(10)*sc(-10)=%lu\n", u_l );
  38:         u_l = sl / ul * sl;
  39:         printf( "sl( -5)/ul(10)*sl( -5)=%lu\n", u_l );
  40: }

実行結果

sc(-128)*sc(-128) = 16384
uc(255)*uc(255) = 65025
sc(-10) <= sl(-5)
sc(-10) > ul(10)
sc(-10)/ul(10)*sc(-10)=16
sl( -5)/ul(10)*sl( -5)=2147483651

問題は、unsignedとsignedの組み合わせで起きます。それも、unsigned側の 方が優先度が高い場合に起きます。signed charの-10は16進数でf6です。これ がunsigned longに伸ばされるとき、上位桁にffffffが付加され、fffffff6に なります。これは10進数では4294967286になります。fffffff6をlongと見るか、 unsigned longと見るかで値は全然違います。負数をunsignedの型に桁上げす ると、0にはならず、このようにとんでもない値になります。したがって、 signed char型の-10が、unsigned long型の10より大きくなりました。

⇒⇒⇒⇒4.5 静的記憶領域


Copyright1996 Hirofumi Fujiwara. No reproduction or republication without written permission
『Cプログラミング専門課程』目次第4章メモリ