Арифметический результат для одного и того же выражения приводит к разным результатам в зависимости от того, определяю ли я целое число в одной строке или использую несколько шагов:
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, что является максимальным значением для unsigned long long в моем компиляторе (veryBigIntOneLine+1 дает 0).
unsigned long long
— это(-1ULL)
или(~0ULL)
. - person Deduplicator   schedule 13.04.2019