Размер макроса? - PullRequest
       5

Размер макроса?

0 голосов
/ 06 апреля 2020

Я хотел знать, какое максимальное число я могу набрать в выражении макроса, пока оно не переполнится. Я написал следующую программу:

#define I (INT_MAX + 1)
#define J (LONG_MAX + 1)

int main()
{
    cout << INT_MAX << I  << endl;
    cout << LONG_MAX << J << endl;
    return 0;
}

Я получил следующий вывод:

2147483647-2147483648
9223372036854775807-9223372036854775808

Я не понимаю переполнение для случая int, если оно может хранить значение LONG_MAX , Кроме того, я вспомнил, что макросы также могут хранить десятичные дроби, такие как 3.14 (PI), поэтому это должен быть тип с плавающей запятой. Я сейчас в замешательстве. Пожалуйста, помогите.

1 Ответ

1 голос
/ 06 апреля 2020

Макросы не имеют типа. Они вообще не взаимодействуют с системой типов. Макросы являются частью этапа предварительной обработки, который выполняется перед компиляцией. Макросы текстовая замена . После предварительной обработки исходного кода компилятор получает следующий результат:

int main()
{
    cout << INT_MAX << (INT_MAX + 1)  << endl;
    cout << LONG_MAX << (LONG_MAX + 1) << endl;
    return 0;
}

... за исключением INT_MAX и LONG_MAX сами по себе макросы, поэтому они были бы расширены до некоторый целочисленный литерал как часть предварительной обработки. Точные значения являются спецификацией реализации c и могут отличаться в разных системах, поэтому я не раскрыл их здесь, чтобы ответ оставался общим.

PS Поведение программы не определено из-за переполнения со знаком.

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