0

如果我们将两种uint32_t类型相乘,并且它们int在该系统上的类型有 63 个值位和一个符号位,那么这些值将转换为int(整数提升)、相乘并转换回uint32_t. 中间结果不能用int:表示2^32-1 * 2^32-1 > 2^63-1,并触发有符号整数溢出,导致未定义的行为。

UINT32_MAX值为2^32-1,因为uint32_t保证有 32 个值位。

uint32_t a = UINT32_MAX ;
uint32_t b = UINT32_MAX ;
uint32_t c = a*b ;

由于具有 64 位大小的 int 平台很常见,我的结论是否正确?由于类型是无符号的,程序员期望结果会换行,但整数提升会因为有符号溢出而导致未定义的行为。

4

1 回答 1

0

如果你有一个int只有 32 个值位的模糊 64 位类型,它仍然具有与 uint32_t 相同的精度。鉴于 6.3.1.1 在确定转换等级时似乎只关心精度,我不认为具有int与 a 相同数量的值位的 64 bituint32_t可以被视为具有更高的转换等级。所以不应该进行整数提升。

当然,无论是否有整数提升,您仍然会溢出,因为UINT32_MAX*2既不适合 uint32_t 也不适合您特有的 64-bit-with-32-value-bits int

于 2015-05-13T12:36:55.960 回答