Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中执行程序时,用于存储中间计算的数据类型是什么+;?_C++_C++14 - Fatal编程技术网

C++ 在C+;中执行程序时,用于存储中间计算的数据类型是什么+;?

C++ 在C+;中执行程序时,用于存储中间计算的数据类型是什么+;?,c++,c++14,C++,C++14,我试图进行以下计算,但发现计算结果不正确。 我有以下疑问,当我的计算机进行计算a*b时,在进行模数计算之前,使用什么数据类型来临时存储计算结果。如何确定存储结果的数据类型?。 请务必让我知道信息的来源 #include <iostream> using namespace std; int main() { long long int a=1000000000000000000; // 18 zeroes long long int b=10000000000000

我试图进行以下计算,但发现计算结果不正确。 我有以下疑问,当我的计算机进行计算a*b时,在进行模数计算之前,使用什么数据类型来临时存储计算结果。如何确定存储结果的数据类型?。 请务必让我知道信息的来源

#include <iostream>
using namespace std;

int main()
{
    long long int a=1000000000000000000; // 18 zeroes
    long long int b=1000000000000000000;
    long long int c=1000000007; 
    long long int d=(a*b)%c;
    cout<<a<<"\n"<<b<<"\n"<<c<<"\n"<<d;
}
#包括
使用名称空间std;
int main()
{
long long int a=10000000000000000;//18个零
长整型b=10000000000000000;
长整型c=100000007;
长整型d=(a*b)%c;

cout我的理解是long-long必须能够容纳至少64位,但每个10000000000000000是一个60位的数字,因此a*b将产生一个超过编译器支持的任何整数表示形式的结果。也许你认为10000000000000000是二进制的

如何确定存储结果的数据类型

一般来说,规则相当复杂和复杂,但在这种特殊情况下很简单。
a*b
属于
long
类型,并且由于
a*b
溢出,程序具有未定义的行为

您可以使用等效公式计算正确的结果(无溢出):


您能否建议如何决定混合数据类型和post 关于你的信息来源

令人感兴趣的是:不幸的是,标准规则更加复杂

作为一些建议:

  • 切勿混合使用未签名和已签名
  • 请注意,小于int的类型将升级为
    int
    无符号
  • 对于
    T
    等于或大于
    int
    的类型,则
    T op T
    将具有类型
    T
    。这是您在表达式中应该瞄准的目标。(即,使同一类型的两个运算符都具有
    int
    long
    long
  • 避免使用未签名的类型。不幸的是,这在当前的标准库设计中是不可能的(
    std::size\t
    sign)
  • 避免
    long
    ,因为当前主要编译器和平台的宽度不同
  • 如果您关心整数数据类型的宽度,那么请避免
    int
    long
    long
    等,并始终使用固定宽度的整数类型(
    std::int32_t
    std::int64_t
    等)。完全忽略这些类型在技术上是可选的

也许我的理解是错误的,但为什么它需要将结果存储在任何地方?@Annabelle我不需要存储结果,我只是想了解计算是如何发生的。例如,在上述情况下,假设先计算a*b,那么任何中间计算的结果是否直接键入到最高数据类型或是否存在其他一些机制?离题:为什么要包含
?@Holt我通常使用相同的模板来编写我的所有代码。这里不需要它。@Milan你永远不应该包含
。这是编译器特定的头。不,我不希望它是二进制的,我只是想了解calc的临时存储是否计算也在数据类型long long int或not中。例如,如果我有一个short int和short int计算,那么存储也会在short int int中吗?那么混合数据类型呢?好的,不是二进制的。我只是建议这样做,因为我不明白为什么你会尝试将太大的数字相乘以避免溢出。再看看“c”,它的数字“7”,我看我的建议没有真正意义。谢谢你的帮助,你可以阅读我在@bolov的帖子上的评论,进一步了解我到底想知道什么。谢谢,有没有地方可以让我阅读规则?因为假设我把a和b作为int,使它们等于100000000,然后做(a*b)%c,保持c长,int,是否有溢出类型?C++中没有整数类型可以保存你的代码> a*b>代码>我给你的例子是什么?“代码> A*B/<代码>的结果和数据类型与周围表达式无关。如果<代码> <代码> <代码> int >代码>和<代码> b>代码> <代码> int
a*b
int
100000000*100000000
不适合
int
,因此您有溢出。您可以通过将至少一个操作数强制转换为
long
,即
静态转换(a),来强制生成
long
结果*b
。同样,周围的表达式是不相关的。
c
的类型对表达式绝对没有影响
a*b
哦,非常感谢。您能否建议如何确定混合数据类型,并发布有关您的信息源的帖子。
#include <iostream>
using namespace std;

int main()
{
    int a=1000000000; // 9 zeroes
    int b=1000000000;
    long long int c=1000000007; 
    long long int d=a*b%c;
    cout<<a<<"\n"<<b<<"\n"<<c<<"\n"<<d;
}
(a * b) % c == ((a % c) * (b % c)) % c