1

次のタイプの変数を使用した割り当てがあるとします。

uint64 = uint16 + uint16 + uint32 + uint64

すべての作業が uint64 を使用して行われている限り、結果の r 値が uint64 内に収まることがわかっていると仮定します。

コンパイラは、標準の C 規則に従って計算を行う前に、2 つの uint16 と uint32 を暗黙的に uint64 に昇格させますか?

すなわち

1.)uint64 = uint16 + uint16 + uint32 + uint64

2.)uint64 = uint64 + uint64 + uint64 + uint64

具体的には、次のスニペットの 2 番目のステートメントを適用します。

両方のオペランドが同じ型の場合、それ以上の変換は必要ありません。

それ以外の場合、両方のオペランドが符号付き整数型であるか、または両方が符号なし整数型である場合、整数変換ランクが小さい型のオペランドは、ランクが大きいオペランドの型に変換されます。

それ以外の場合、符号なし整数型のオペランドのランクが他のオペランドの型のランク以上である場合、符号付き整数型のオペランドは符号なし整数型のオペランドの型に変換されます。

それ以外の場合、符号付き整数型のオペランドの型が符号なし整数型のオペランドの型のすべての値を表すことができる場合、符号なし整数型のオペランドは符号付き整数型のオペランドの型に変換されます。

それ以外の場合、両方のオペランドは、符号付き整数型のオペランドの型に対応する符号なし整数型に変換されます。

または、その規則は算術式の直接の lhs と rhs のみに適用され、2 つの uint16 の加算が最初に計算され、結果がわかるまで型が昇格されず、次に uint32 に昇格され、この結果uint64などに昇格...

すなわち

1.)uint64 = uint16 + uint16 + uint32 + uint64

2.)uint64 = (((uint16 + uint16) + uint32) + uint64)

3.)uint64 = ((uint32 + uint32) + uint64)

4.)uint64 = (uint64 + uint64)

これを解決する可能性のあるC標準ルールも教えてください。

4

1 に答える 1

3

規則は中間結果に適用されます。

uint16 + uint16 + uint32 + uint64

と同等です

((uint16 + uint16) + uint32) + uint64

+通常の算術変換は、演算子の両側で実行されます。

(C99、6.5.6 加算演算子 p4) 「両方のオペランドが算術型の場合、通常の算術変換がそれらに対して実行されます。」

を仮定32-bit intすると、これは実際には次と同じであることに注意してください。

(uint64) ((unsigned int) ((int) uint16 + (int) uint16) + uint32) + uint64

uint16intは ではなく に昇格し、結果は のために にunsigned int変換されます。unsigned intuint32

于 2013-08-13T22:15:07.750 に答える