【发布时间】:2021-07-29 18:19:47
【问题描述】:
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 会给出令人不快的输出?
【问题讨论】:
-
如果在每个数字上添加
ULL后缀,第一种情况会发生什么?或者在第二种情况下,将UL添加到每个数字? undefined behavior 导致程序在我的机器上崩溃。 -
gcc 给一个提示:
warning: integer overflow in expression [-Woverflow]并为这两个声明生成 18446744072317341664。 -
我想@Eljay 关于
ull的东西是对的。 191689628 和所有其他数字都是 有符号整数 4 字节长。编译器将它们加在一起,总和大于 32 位有符号整数的容量,因此发生溢出。s在发生溢出后 被分配。将ull或ul添加到第一个数字可防止溢出,因为编译器首先分配64 位无符号整数并添加其余部分。 -
@Suthiro "并为两个声明生成 18446744072317341664" - 只有当
long的大小为 64 位时才会如此。如果它是 32 位大小则不是,这在 OP 案例中显然是正确的。
标签: c++ data-structures long-integer unsigned unsigned-integer