【发布时间】:2015-05-13 12:22:30
【问题描述】:
如果我们将两个uint32_t 类型相乘并且它们键入int,在这个系统上有63 个值位和一个符号位,那么这些值将转换为int(整数提升),相乘,然后再转换回@ 987654325@。中间结果不能用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 ;
由于 int 大小为 64 位的平台很常见,我的结论是否正确?由于类型是无符号的,程序员希望结果会自动换行,但整数提升会因为有符号溢出而导致未定义的行为。
【问题讨论】:
-
@LPs 好吧,这显然不是真的。无符号不能溢出。例如,在 uint32_t 不会转换为 int 并保持无符号的平台上。但这不是我的问题。
-
第一部分是真的吗?
UINT32_MAX * UINT32_MAX如果你有 64 位整数,会设置最高位(它是 FFFFFFFE00000001),这是不允许的吗? -
@harold 是的,即使 int 有 63 个值位,它也会溢出 int。嗯,这样更容易。
-
所以在这种情况下,请参阅:stackoverflow.com/q/27001604/555045
-
@harold 是的,这是非常狡猾的行为。
标签: c standards language-lawyer integer-overflow integer-promotion