Когда мы предпринимаем операцию над int, результат временно сохраняется в int?

0

Я решал проблему в онлайн-судье, используя C, и я столкнулся с этой проблемой.

Ограничение: t <= 10 9
У меня есть неправильный ответ, когда я объявлял t int int и Answer Accept, когда я объявил это как долгое время.

Решение включает в себя следующий математический расчет:

    m = (-3 + sqrt(12*t - 3))/(float)6 ;

Я подумал, что, возможно, 12 * t - 3 хранится в int, хотя и временно, что дает ошибку. Может кто-нибудь скажет мне, прав ли я?

  • 0
    да .. это может быть возможно, что .piler проверяет контрольный пример с t = 10 ^ 9, который пересекает целочисленный предел
  • 0
    Должны ли мы знать, что означают «WA» и «AC»? Это какие-то сообщения об ошибках?
Показать ещё 4 комментария
Теги:
types

2 ответа

4
Лучший ответ

Да. Типы, меньшие, чем int передаются int (или unsigned int) перед вычислениями, но вычисление с int приводит к новому int.

Если ваш результат переполнит int, лучше всего убедиться, что хотя бы один из операндов является типом, достаточно большим для хранения результата.

  • 0
    Следует отметить, что 12 * 1000000000 переполнит int , что приведет к неправильному ответу.
  • 0
    @Gabe: Ну, int может быть достаточно большим, чтобы вместить это, но обычно это не так.
0

Если t является int 12*t, это int int. Вывод типа в выражении C идет снизу вверх. Это означает, что (временный) результат 12 * t сохраняется в 32-битном целочисленном регистре, он переполняется над пределом (который составляет около 2E + 9), и вы получаете неправильный результат. Умный компилятор может предупредить вас об этом, потому что он может вывести из кода, что это произойдет в некоторых случаях.

Если вы объявляете t так long long, оно имеет диапазон до 2 ^ 63, давая что-то вроде 8E + 18. В этом случае выражение 12*t набирается long long и хранится в 64-битном регистре (или в паре из 32 регистров, если ваш компьютер не имеет 64-битных регистров), и выражение дает правильный результат.

  • 0
    Компилятор не знает, насколько большим будет t ...
  • 0
    Конечно, предел для 32-разрядного типа int составляет 2 ^ 31 или 2 ^ 32, и, конечно же, 2 * 2 ^ 9 равен 2 ^ 10?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню