gpt4 book ai didi

c++ - 10 位数字但不是 18 位数字的整数溢出?

转载 作者:行者123 更新时间:2023-12-03 07:57:46 25 4
gpt4 key购买 nike

#include <bits/stdc++.h>
using namespace std;
unsigned long long findPeople(double p){
return ceil(sqrt(2*143545666897673985*log(1/(1-p))));
}
int main(){
printf("%lld",findPeople(0.5));
}

这是我的代码。我正在尝试计算生日悖论,但使用更大的数字(用于数学作业),当我使用这个数字(143545666897673985)时它工作正常,但是当我使用另一个数字(1842350265)时它会出现此消息:

warning: integer overflow in expression of type ‘int’ results in ‘-610266766’ [-Woverflow]
4 | return ceil(sqrt(2*1842350265*log(1/(1-p))));
| ~^~~~~~~~~~~

我是编码新手,我不知道自己在做什么。我很困惑为什么 10 位数字会出现整数溢出,但 18 位数字不会出现整数溢出。

我尝试使用unsigned long long,它不应该修复它,但它没有。如有任何帮助,我们将不胜感激:)

最佳答案

不带后缀的十进制整数文字的类型是 intlonglong long 中第一个可以保存该值的类型。

在通常的桌面系统上,int 是 32 位宽,longlong long 是 64 位宽,那么

  • 2 的类型为 int
  • 1842350265 的类型为 int
  • 143545666897673985 的类型为 (long) long

在与 * 的乘法中,如果两边都是 int 类型,则运算将以 int 类型完成。如果第二个操作数的类型为(long) long,则操作将在(long) long中完成。

碰巧2*1842350265的数学精确值不适合有符号的32位整数(例如int),但是2*143545666897673985 确实适合有符号的 64 位宽整数(例如 (long) long)。因此有符号溢出发生在第一种情况,而不是后者。

如果确实发生了有符号溢出,您不能依赖编译器对此发出的警告。它会导致未定义的行为,这意味着您将无法保证程序和编译器的行为方式。您只需确保它永远不会发生。

由于函数中的所有其他操作都作用于 float ,而不是整数,因此您可能希望在任何地方都使用 float 。例如。 2.0 的类型为 double143545666897673985.0 等也是如此。

关于c++ - 10 位数字但不是 18 位数字的整数溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75610126/

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