假设在 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;否则,它将转换为无符号整数。这些被称为整数提升。(48) 所有其他类型都不受整数提升的影响。
48) 整数提升仅适用于:作为通常算术转换的一部分,适用于某些参数表达式,适用于一元 +、- 和 ~ 运算符的操作数,以及移位运算符的两个操作数,由它们各自指定子条款。
但是,根据以下内容,结果是明确定义的,因为涉及无符号操作数的计算不会溢出:
6.2.5-9
有符号整数类型的非负值范围是相应无符号整数类型的子范围,并且每种类型中相同值的表示是相同的。(31)涉及无符号操作数的计算永远不会溢出,因为结果不能用得到的无符号整数类型表示,以比结果类型可以表示的最大值大一的数字为模减少。
product
上述语句中的变量是否具有明确定义的值?
编辑:在以下情况下会发生什么?
unsigned short lhs = USHRT_MAX;
unsigned short rhs = USHRT_MAX;
unsigned short product = lhs * rhs;