关于无符号整数下溢的 C 行为问题

发布于 2024-08-31 00:45:22 字数 240 浏览 4 评论 0原文

我在很多地方读到,与有符号整数溢出不同,C 中无符号整数溢出是明确定义的。

下溢是一样的吗?

例如:

unsigned int x = -1; // Does x == UINT_MAX?

谢谢。

我不记得在哪里,但我在某处读到无符号整数类型的算术是模块化的,所以如果是这种情况,那么 -1 == UINT_MAX mod (UINT_MAX+1)。

I have read in many places that unsigned integer overflow is well-defined in C unlike the signed counterpart.

Is underflow the same?

For example:

unsigned int x = -1; // Does x == UINT_MAX?

Thanks.

I can't recall where, but i read somewhere that arithmetic on unsigned integral types is modular, so if that were the case then -1 == UINT_MAX mod (UINT_MAX+1).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

-小熊_ 2024-09-07 00:45:22

§6.3.1.3 有符号和无符号整数,第 2 段:

如果新类型是
无符号,该值转换为
反复加或减一
超过可以的最大值
以新类型表示,直到
该值在新的范围内
类型。

所以是的,x == UINT_MAX

§6.3.1.3 Signed and unsigned integers, paragraph 2:

if the new type is
unsigned, the value is converted by
repeatedly adding or subtracting one
more than the maximum value that can
be represented in the new type until
the value is in the range of the new
type.

So yes, x == UINT_MAX.

贪恋 2024-09-07 00:45:22

-1,当表示为 2 的补码时,无论您的数字有多少位,都等于 0xFF...F。在无符号数字空间中,该值是可能的最大值(即设置所有位)。因此,是的,x == UINT_MAX。以下代码在 C99 严格编译器上发出“1”:

#include <stdio.h>
#include <stdint.h>
#include <limits.h>

int main(int argc, char **argv){
  uint32_t x = -1;      
  printf("%d", x == UINT_MAX ? 1 : 0);
  return 0;
}

-1, when expressed as a 2's complement number, amounts to 0xFF...F for how ever many bits your number is. In an unsigned number space that value is the maximum value possible (i.e. all the bits are set). Therefore yes, x == UINT_MAX. The following code emits "1" on a C99 strict compiler:

#include <stdio.h>
#include <stdint.h>
#include <limits.h>

int main(int argc, char **argv){
  uint32_t x = -1;      
  printf("%d", x == UINT_MAX ? 1 : 0);
  return 0;
}
忆依然 2024-09-07 00:45:22

你混合了有符号和无符号的数字,这是不酷的。

unsigned int x = 0u - 1u; // is OK though

You are mixing signed and unsigned numbers, which is uncool.

unsigned int x = 0u - 1u; // is OK though
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文