неожиданные результаты деления и модуля в с ++ - PullRequest
0 голосов
/ 05 марта 2020

почему 990099009900/10 равно -203843547 в c ++?

#include <iostream>
using namespace std;
int main()
{
    long int n = 990099009900;
    cout << n / 10;
}

Ответы [ 2 ]

2 голосов
/ 05 марта 2020

Если вы запустите это здесь:

std::cout << "limit " << std::numeric_limits<long int>::max();

Вы, вероятно, получите 2147483647, например, как это происходит в Visual Studio. Вместо этого попробуйте long long:

#include <iostream>
int main()
{
    long long n = 990099009900;
    std::cout << n / 10;
}

Это гарантированный , по крайней мере, 64-битный, в то время как long int нет (это по крайней мере 32-битный). 32 бита недостаточно для хранения 990099009900.

1 голос
/ 05 марта 2020

Вам нужно использовать long long для числа такого размера, чтобы ваш код был переносимым.

Вы используете систему, где ваш LONG_MAX (то есть std::numeric_limits<long>::max()) меньше чем 990099009900.

У этой гибкости есть свои недостатки, что является одной из причин, по которой были введены типы фиксированной ширины, такие как std::int64_t.

Другой подход заключается в использовании

auto n = 990099009900;

и пусть компилятор выяснит это, хотя это может вызвать проблемы, если вы близки к пределу типа и увеличиваете n.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...