Арифметический результат для одного и того же выражения приводит к разным результатам в зависимости от того, задаю ли я целое число в одной строке или использую несколько шагов:
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 - ожидаемый ответ (какон дается для всех четырех выражений калькулятором Google).
Также 18446744073709551615 , вероятно, не является точным результатом того, что вычисляется, поскольку я получаю предупреждение о переполнении во время компиляции для обеих строквыражения (даже когда я пытался с типом __int128).На самом деле это 2 ^ 64-1 , что является максимальным значением для длинных без знака с моим компилятором ( veryBigIntOneLine + 1 дает 0 ).