долго долго не может хранить целое число?

В моем задании написано: «Не добавляйте длинных int или long long private членов для достижения этой цели, поскольку нет гарантии, что любой из них действительно может хранить большие числа, чем int». Я знаю, что int имеет максимум 2 ^ 31-1, а long long имеет максимум 2 ^ 63-1. Так может ли кто-нибудь дать мне пример, почему данное предложение верно?

Заранее спасибо!

4

Решение

Это означает именно то, что говорится. Там нет никакой гарантии, что long long может хранить больше номеров, чем int, Это по крайней мере, такой большой, но это может быть то же самое.

Я знаю, что int имеет максимум 2 ^ 31-1, а long long имеет максимум 2 ^ 63-1

Это может быть верно для некоторой платформы, с некоторым компилятором, но это не всегда то же самое. С ++ тоже не гарантирует.

3.9.1 Фундаментальные типы [basic.fundamental]

2) Существует пять стандартных целочисленных типов со знаком: «signed char»,
«short int»,«int»,«long int«, а также «long long int». В этом списке
каждый тип обеспечивает как минимум столько же памяти, сколько предшествующий ему в
список. […] (выделение мое)

7

Другие решения

Стандарт C определяет два соответствующих критерия:

  • sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long) ≤ sizeof(uintmax_t)

    Это косвенно указано в ISU / IEC 9899: 2011, §6.2.5 Типы, ¶8: Для любых двух целочисленных типов с одинаковой подписью и разным целым числом
    (см. 6.3.1.1), диапазон значений типа с меньшим целочисленным рангом преобразования
    поддиапазон значений другого типа.

  • Минимально допустимое значение для максимумов типов (ISO / IEC 9899: 2011, §5.2.4.2.1 Размеры целочисленных типов <limits.h>):

    • SCHAR_MAX ≥ 127 // 27-1
    • SHRT_MAX ≥ 32,767 // 215-1
    • INT_MAX ≥ 32,767 // 215-1
    • LONG_MAX ≥ 2 147 483 647 // 231-1
    • LLONG_MAX ≥ 9,223,372,036,854,775,807 // 263-1

Цитата формально верна; можно разработать системы, в которых long не хранит больший диапазон, чем int — действительно, это относится к большинству 32-битных систем (все, что я знаю), а также к Windows 64. С меньшей вероятностью, он будет точным с w.r.t. long long; Я не знаю ни одной системы, где sizeof(int) == sizeof(long long) (и из-за указанного неравенства sizeof(int) == sizeof(long)). На большинстве 64-битных систем Unix sizeof(int) == 4, sizeof(long) == 8, а также sizeof(long long) == 8; в Windows 64, sizeof(long) == 4 и только long long (или же __int64) является 64-битным типом.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector