【问题标题】:Is decrementing an unsigned int below 0 undefined behavior? [duplicate]是否将 unsigned int 递减到 0 以下未定义的行为? [复制]
【发布时间】:2015-01-11 00:10:20
【问题描述】:

这是未定义的行为吗?

unsigned int size = 0;
size -= 1;

【问题讨论】:

  • 没有。 C 标准保证模幂二环绕。 6.2.5 Types 第 9 条说:涉及无符号操作数的计算永远不会溢出,因为无法由结果无符号整数类型表示的结果会以大于 1 的数为模减少结果类型可以表示的最大值。
  • 在最近的一个问题中,这是一个有趣的问题,询问int i = INT_MAX + 1; 是否会导致 UB。但是关注@5gon12eder 我喜欢stackoverflow.com/questions/18195715/…
  • @WeatherVane:我认为一个实现可以合法地定义它的数字类型,这样增加一个低于int 的类型的无符号值可能会产生未定义的行为,但我认为这不是真的递减。如果小于int 的无符号值提升为int,则int 将能够毫无困难地表示0 和-1;需要将有符号值 -1 强制为任何大小的无符号类型以产生该值,该值在转换为适当大的类型、递增和强制回退时将产生零。

标签: c undefined-behavior unsigned-integer


【解决方案1】:

无符号整数对所有算术运算都有明确定义的行为;具体来说,它们实现了“算术模 2N”,其中 N 是类型中值的位数。所以-1 实际上是 2N - 1.

【讨论】:

  • 这是否意味着unsigned int x; for (x = SOME_POSITIVE_VALUE ; x >= 0 ; --x); 是一个无限循环?
  • (比加法更有趣的是移位和求余运算,对于无符号整数的推理也比有符号整数要简单得多。)
  • @iharob 是的。根据定义,unsigned 整数是>= 0
  • @iharob:对于无符号整数xx >= 0 始终为真,是的。
  • 我只是确保它不是 undefined behavior,我没有任何 c 标准的副本,而且因为我住在委内瑞拉,现在买不起。 >
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
相关资源
最近更新 更多