gpt4 book ai didi

c - 64 位整数的绝对值问题

转载 作者:行者123 更新时间:2023-12-04 12:20:16 25 4
gpt4 key购买 nike

此 C 代码试图找到负数的绝对值,但输出也是负数。谁能告诉我如何克服这个问题?

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

int main() {
int64_t a = 0x8000000000000000;
a = llabs(a);
printf("%" PRId64 "\n", a);
return 0;
}

输出
-9223372036854775808

更新:

感谢您的所有回答。我知道这是一个非标准值,这就是我无法对其执行绝对操作的原因。但是,我确实在遗传编程模拟的实际代码库中遇到过这种情况。此处的“有机体”不了解 C 标准并坚持生成此值 :) 谁能告诉我解决此问题的有效方法?再次感谢。

最佳答案

如果 llabs() 的结果不能用类型 long long 表示,则行为未定义。我们可以推断这就是这里发生的事情——超出范围的值 0x8000000000000000 在转换为 int64_t 时被转换为值 -9223372036854775808 ,以及您的 long long值是 64 位宽,因此值 9223372036854775808 无法表示。

为了让您的程序具有定义的行为,您必须确保传递给 llabs() 的值。不小于-LLONG_MAX .您如何做到这一点取决于您 - 要么修改“有机体”,使其无法生成此值(例如,过滤掉那些创建立即不适合的超出范围值的值),要么在将其传递给之前限制该值llabs() .

关于c - 64 位整数的绝对值问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17936690/

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