gpt4 book ai didi

C安全地取整数的绝对值

转载 作者:太空狗 更新时间:2023-10-29 16:28:41 25 4
gpt4 key购买 nike

考虑以下程序 (C99):

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

int main(void)
{
printf("Enter int in range %jd .. %jd:\n > ", INTMAX_MIN, INTMAX_MAX);
intmax_t i;
if (scanf("%jd", &i) == 1)
printf("Result: |%jd| = %jd\n", i, imaxabs(i));
}

据我了解,这包含容易触发的未定义行为,如下所示:

Enter int in range -9223372036854775808 .. 9223372036854775807:
> -9223372036854775808
Result: |-9223372036854775808| = -9223372036854775808

问题:

  1. 当用户输入错误数字时,这真的是未定义的行为吗,如“允许代码触发任何代码路径,任何代码都会影响编译器的幻想”?还是其他一些未完全定义的味道?

  2. 迂腐的程序员如何着手防范这种情况,做出任何不受标准保证的假设?

(有几个相关问题,但我没有找到可以回答上面问题 2 的问题,所以如果您建议重复,请确保它回答了那个问题。)

最佳答案

如果 imaxabs 的结果无法表示,如果使用二进制补码可能会发生,则行为未定义

7.8.2.1 The imaxabs function

  1. The imaxabs function computes the absolute value of an integer j. If the result cannot be represented, the behavior is undefined. 221)

221) The absolute value of the most negative number cannot be represented in two’s complement.

不做任何假设且始终定义的检查是:

intmax_t i = ... ;
if( i < -INTMAX_MAX )
{
//handle error
}

(如果使用补码或符号大小表示,则无法执行此 if 语句,因此编译器可能会给出无法访问的代码警告。代码本身仍然是已定义且有效的。)

关于C安全地取整数的绝对值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35251410/

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