如果我们将两个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位的平台很常见,我的结论是否正确?程序员期望结果将换行,因为类型是无符号的,但整数提升会因签名溢出而导致未定义的行为。
答案 0 :(得分:0)
如果你有一个模糊的64位int
类型,只有32位值,它仍然具有与uint32_t相同的精度。鉴于6.3.1.1在确定转换等级时似乎只关注精度,我认为64位int
与uint32_t
的值位数相同,不能被认为具有更高的转换率。所以不应该进行整数提升。
无论是否有整数提升,你当然都会溢出,因为UINT32_MAX*2
不能适应uint32_t,也不适合你特有的64位32位值{{ 1}}。