使用不同的表达式计算同一整数时的结果不一致
Non consistent results when calculating the same integer with different expressions
同一表达式的算术结果会导致不同的结果,具体取决于我在一行中定义整数或使用几个步骤:
int main() {
unsigned long long veryBigIntOneLine = ((255*256+255)*256+255)*256+255;
unsigned long long veryBigInt = 255;
veryBigInt *= 256;
veryBigInt += 255;
veryBigInt *= 256;
veryBigInt += 255;
veryBigInt *= 256;
veryBigInt += 255;
unsigned long long veryBigIntParanthesis = (((((255*256)+255)*256)+255)*256)+255;
unsigned long long fourthInt = 256;
fourthInt *= 256;
fourthInt *= 256;
fourthInt *= 256;
--fourthInt;
cout << "veryBigIntOneLine: " << veryBigIntOneLine << endl;
cout << "veryBigInt: " << veryBigInt << endl;
cout << "veryBigIntParanthesis: " << veryBigIntParanthesis << endl;
cout << "fourthInt: " << fourthInt << endl;
return 0;
}
它们都应该描述相同的数字,256^4-1(或2^32-1(,但结果是不同的。
veryBigIntOneLine: 18446744073709551615
veryBigInt: 4294967295
veryBigIntParanthesis: 18446744073709551615
fourthInt: 4294967295
4294967295是预期的答案(因为它是由谷歌计算器为所有四个表达式给出的(。
此外,18446744073709551615可能不是计算结果的确切结果,因为我在编译时收到两个单行表达式的溢出警告(即使我尝试使用 __int128 类型(。它实际上是 2^64-1,这是我的编译器的无符号长长的最大值(veryBigIntOneLine+1 给出 0(。
初始化
代码((255*256+255)*256+255)*256+255
遭受有符号整数溢出(未定义行为(以及有符号int到无符号的隐式转换。虽然分步计算避免了这些问题,但右手操作数被隐式转换为无符号长整型。
只需使用适当的文字即可解决这些问题:
unsigned long long veryBigIntOneLine{ ((255ull*256ull+255ull)*256ull+255ull)*256ull+255ull}; // 4294967295
这是因为
您没有使用unsigned long long
文字。如果您希望文本与您的定义匹配,则需要使用:
255ULL + 256ULL * 255ULL + ...
如果创建 64 位的数字,则ULL
非常重要。在 C 中,没有后缀的数字可能是 64、32 甚至只有 16 位(甚至某些 CRAY 上的字节为 64 位。这也意味着您的代码可以在其中一个 CRAY 系统上找到。
相关文章:
- 整数不会重复超过随机数
- 大于65535的C++数组[size]引发不一致的溢出
- 在 C++(和 C)中进行类型转换时明显不一致
- 填充上编译器生成的复制构造函数之间的不一致
- 犰狳的 print() 方法和 cout 在从 Rcpp 调用时顺序不一致
- CreateDIBSection为同一图像返回不一致的位图位值
- 在 Qml 中从 QSqlTableModel 中删除单行时视图不一致
- C++字符串大小减去整数不是预期值,为什么?
- 模板参数推导不一致
- 声明中不一致的no是否违反ODR?
- 如何删除分支因子不一致的树,最大为 30,40
- 从 C++ 函数与 Python 函数返回的不一致值用于偏斜正态分布
- 从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
- 这种比较是否不一致(或者存在其他问题)?
- 以下可变参数模板行为是否不一致?
- 如何修复我的链表读数不一致的问题?
- 在C++17中,为什么类模板和函数模板的指针类型推导明显不一致
- 在C/C++中检查数字是否为整数(不带scanf/gets/etc)
- void 函数中的指针参数返回不一致的值
- 使用不同的表达式计算同一整数时的结果不一致