2

何かに取り組んでいて、次のようなコードに出くわしました。

#define MODULUS(a,b)        ((a) >= 0 ? (a)%(b) : (b)-(-a)%(b))

unsigned char w;
unsigned char x;
unsigned char y;
char z;

/* Code that assigns values to w,x and y.  All values assigned 
   could have been represented by a signed char. */

z = MODULUS((x - y), w);

演算(x - y)は型変換の前に行われ、マクロは常に(a)%(b)-- と評価されることを理解しています。結果は常にゼロ以上の unsigned char になるからです。ただし、コードは意図したとおりに機能し、私の理解には欠陥があると思います。そう...

私の質問は次のとおりです。

  1. 式が評価される前に、signed char への暗黙的な型変換が発生しますか?

  2. 上記のコードが機能しない状況 (たとえば、符号なしの値が大きすぎて符号付きの値で表すことができない場合) はありますか?

4

1 に答える 1

2

式が評価される前に、signed char への暗黙的な型変換が発生しますか?

intいいえ、式x - yが評価される前にへの変換が発生します¹。したがって、結果はマイナスになる可能性があります。

上記のコードが機能しない状況 (たとえば、符号なしの値が大きすぎて符号付きの値で表すことができない場合) はありますか?

の場合sizeof int == 1、整数プロモートはunsigned chars をs にプロモートし、モジュラス by の前にモジュラスbyが符号なし算術のために実行されるためunsigned int、間違った結果を生成する可能性があります。wUINT_MAX + 1

¹ デフォルトの整数昇格。

于 2012-07-19T21:35:09.887 に答える