C実装(たとえば、x86 Cコンパイラ)USHRT_MAX = 65535
とINT_MAX = 2147483647
。では、次のステートメントは明確に定義されていますか?
unsigned short product = USHRT_MAX * USHRT_MAX;
C99標準の次のように、両方のオペランドがに昇格されint
(int
のすべての可能な値を表すことができるunsigned short
ため)、したがって、オーバーフローが発生するため、結果は明確に定義されません(65535 ^ 2 = 4294836225 > 2147483647
)、つまり、の値product
は明確に定義された:
6.3.1.1-1
intが元の型のすべての値を表すことができる場合、値はintに変換されます。それ以外の場合は、unsignedintに変換されます。これらは整数プロモーションと呼ばれます。(48)他のすべてのタイプは整数プロモーションによって変更されません。
48)整数拡張は、通常の算術変換の一部として、特定の引数式、単項+、-、および〜演算子のオペランド、およびそれぞれによって指定されたシフト演算子の両方のオペランドにのみ適用されます。副次句。
ただし、以下によれば、符号なしオペランドを含む計算はオーバーフローしないため、結果は明確に定義されています。
6.2.5-9
符号付き整数型の非負の値の範囲は、対応する符号なし整数型のサブ範囲であり、各型での同じ値の表現は同じです。(31)符号なし整数を含む計算は、次のような結果になるため、オーバーフローすることはありません。結果の符号なし整数型で表すことはできませんが、結果の型で表すことができる最大値より1大きい数を法として減らされます。
product
前述のステートメントの変数には明確に定義された値がありますか?
編集:次の場合はどうなりますか?
unsigned short lhs = USHRT_MAX;
unsigned short rhs = USHRT_MAX;
unsigned short product = lhs * rhs;