整数促销,价值位和倍增

时间:2015-05-13 12:22:31

标签: c standards language-lawyer integer-overflow integer-promotion

如果我们将两个uint32_t类型相乘并且它们在此系统上的类型int有63个值位和一个符号位,那么这些值将转换为int(整数提升),乘以,并转换回uint32_t。中间结果不能由int2^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位的平台很常见,我的结论是否正确?程序员期望结果将换行,因为类型是无符号的,但整数提升会因签名溢出而导致未定义的行为。

1 个答案:

答案 0 :(得分:0)

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

无论是否有整数提升,你当然都会溢出,因为UINT32_MAX*2不能适应uint32_t,也不适合你特有的64位32位值{{ 1}}。