仅更改数据类型就会出现意外输出

Unexpected outputs are coming by only changing the data type

unsigned long long int s=0;
s=191689628 +646033877 +109099622 +798412961 +767677318+ 190145527 +199698411;
cout<<s<<endl;

return 0;

以上代码的输出为 18446744072317341664。

unsigned long int s=0;

s=191689628 +646033877 +109099622 +798412961 +767677318+ 190145527 +199698411;
cout<<s<<endl;

return 0;

上面代码的输出是 2902757344,这是正确的值。

为什么 unsigned long long int 给出了不愉快的输出?

你所有的integer literals都在使用int类型,所以191689628 + 646033877 + 109099622 + 798412961 + 767677318 + 190145527 + 199698411的结果超过了最高的int值,因此溢出。 有符号整数溢出是未定义的行为

然后您将溢出的值()分配给 unsigned 类型,这会导致它们各自类型的巨大值. unsigned long long int(通常)大于 unsigned long int,因此差异会更大。这就是您看到这些结果的原因。

为避免溢出,请使用 unsigned 文字开头。

在第一个示例中,将 ullULL 后缀添加到每个文字后,使它们都成为 unsigned long long int 而不是 int:

unsigned long long int s = 0;
s = 191689628ULL + 646033877ULL + 109099622ULL + 798412961ULL + 767677318ULL + 190145527ULL + 199698411ULL;
cout << s << endl;

在第二个示例中,使用 ulUL 后缀代替:

unsigned long int s = 0;
s = 191689628UL + 646033877UL + 109099622UL + 798412961UL + 767677318UL + 190145527UL + 199698411UL;
cout << s << endl;

Online Demo