【问题标题】:Integer promotions, value bits, and multiplying [duplicate]整数提升、值位和乘法 [重复]
【发布时间】: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


【解决方案1】:

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

不管是否有整数提升,你当然仍然会溢出,因为UINT32_MAX*2 不能适应 uint32_t 也不能​​适应你特有的 64-bit-with-32-value-bits int

【讨论】:

  • 没有将 int 定义为共有 64 位和 31 个填充位。我想我已经明确指出:32 个值位、1 个符号位和 31 个填充位。具有 32 个值位的整数可以表示 uint32_t 的所有值,因为 uint32_t 正好有 32 个值位。
  • @reader 啊,误读了那部分。让我更新答案。
  • 对不起,我已经对问题进行了大量编辑。
  • @reader 对你有好处,谢谢你浪费我的时间。再见。
  • 什么?你不是想帮助别人吗?是的,您没有获得积分,但您确实帮助了某人。所以只有分数对你很重要?
猜你喜欢
  • 2011-03-29
  • 2012-10-05
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
相关资源
最近更新 更多