Ответ 1
Проблема заключается в том, что буква "99" обрабатывается как int. Если вы добавите "L", он будет считать его длинным. Чтобы устранить проблему с компиляцией, выполните следующие действия.
long test2 = 99L * 99L * 99L * 99L * 99L;
И исправить "неправильный результат", вызванный переполнением целых чисел:
long r = 99;
long test1 = r * r * r * r * r;
Ключевым моментом является то, что выражение справа от "=" оценивается до того, как выполняется присвоение long r
.
Существуют и другие буквенные суффиксы, которые могут вас заинтересовать:
Type Suffix Example
uint U or u 100U
long L or l 100L
ulong UL or ul 100UL
float F or f 123.45F
decimal M or m 123.45M
@m.edmonson, касающийся вашего вопроса о том, почему это выходит на 919965907. Что происходит, это то, что значение "обертывание" вокруг int.MaxValue. Вы можете увидеть это с помощью небольшой тестовой программы:
int i = 99; // 99
i *= 99; // 9801
i *= 99; // 970299
i *= 99; // 96059601
i *= 99; // 919965907 should be 9509900499 but comes out to 919965907
// which is (9509900499 % int.MaxValue)
long k = 9509900499 % int.MaxValue;
Что означает "обертывание"? Когда вы превысите int.MaxValue
на 1, значение "возвращается" на int.MinValue
.
int j = int.MaxValue;
j++;
bool isNowMinValue = (j == int.MinValue); // true, the value has "wrapped around"
Это немного упрощенно; если вы ищете "целочисленное переполнение", вы получите лучшее объяснение. Стоит понять, как целые числа (и другие числовые типы) представлены 32 битами: