仅更改数据类型就会出现意外输出
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 文字开头。
在第一个示例中,将 ull
或 ULL
后缀添加到每个文字后,使它们都成为 unsigned long long int
而不是 int
:
unsigned long long int s = 0;
s = 191689628ULL + 646033877ULL + 109099622ULL + 798412961ULL + 767677318ULL + 190145527ULL + 199698411ULL;
cout << s << endl;
在第二个示例中,使用 ul
或 UL
后缀代替:
unsigned long int s = 0;
s = 191689628UL + 646033877UL + 109099622UL + 798412961UL + 767677318UL + 190145527UL + 199698411UL;
cout << s << endl;
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 文字开头。
在第一个示例中,将 ull
或 ULL
后缀添加到每个文字后,使它们都成为 unsigned long long int
而不是 int
:
unsigned long long int s = 0;
s = 191689628ULL + 646033877ULL + 109099622ULL + 798412961ULL + 767677318ULL + 190145527ULL + 199698411ULL;
cout << s << endl;
在第二个示例中,使用 ul
或 UL
后缀代替:
unsigned long int s = 0;
s = 191689628UL + 646033877UL + 109099622UL + 798412961UL + 767677318UL + 190145527UL + 199698411UL;
cout << s << endl;