gpt4 book ai didi

c - 无符号整数溢出检测表达式

转载 作者:行者123 更新时间:2023-12-01 13:50:28 26 4
gpt4 key购买 nike

程序会生成阶乘数,直到发生溢出。表达式 r <= UINT_MAX / j是检测溢出。现在,如果我将表达式重写为 r * j <= UINT_MAX ,就会进入死循环。我的问题不是关于如何检测整数溢出。这就是为什么表达式会让进程进入死循环的原因。

for (unsigned i = 0;;++i) {
unsigned r = 1;
for (unsigned j = 2; j <= i; ++j) {
if (r <= UINT_MAX / j)
r *= j;
else {
printf("Overflow!\n");
}
}
}

最佳答案

无符号整数类型的算术其最大值加 1。
在您的情况下,我们有算术模 (UINT_MAX+1) .

所以,操作r*j总是给出结果<= UINT_MAX , 并且比较总是正确的。

然而,当rUINT_MAX / j 进行比较, real(数学)算术与无符号类型算术一致,因为 UINT_MAX / j在数学上是在 unsigned 的范围内.
这解释了为什么在 C 代码中条件为真或为假的方式与数学比较完全相同。

因此,r <= UINT_MAX/j方法是正确的。

关于c - 无符号整数溢出检测表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32153953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com