Каковы правила печати беззнакового короткого значения после ввода целого числа вне диапазона беззнакового короткого? - PullRequest
1 голос
/ 24 апреля 2020
#include <iostream>
#include <climits>
int main(void) {
    std::cout << SHRT_MIN << std::endl;
    std::cout << SHRT_MAX << std::endl;
    //-32768 ~ 32767 is the range
    short a;
    std::cin >> a;
    std::cout << "decimal: " << a << std::endl;//decimal
    return 0;
}

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

Когда я вводю любое целое число меньше -32768, например -3333333, -32768 будет напечатано.

Когда я введу любое целое число больше 32767, например, 3333333, будет напечатано 32767.

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

Вот код:

#include <iostream>
#include <climits>
int main(void) {
    std::cout << USHRT_MAX << std::endl;
    unsigned short a;
    std::cin >> a;
    std::cout << "decimal: " << a << std::endl;//decimal
    return 0;
}

Кажется, что нет USHRT_MIN , но я думаю, что это 0, который является самым маленьким.

Таким образом, диапазон беззнакового короткого 0 ~ 65535 является диапазоном.

Когда я введу любое целое число больше 65535, например, 3333333, будет напечатано 65535.

Теперь приходит часть, которая сбивает с толку меня много.

Когда я ввожу целое число меньше 0,

-1, decimal: 65535
-2, decimal: 65534
-3, decimal: 65533
-4, decimal: 65532
...
-65534, decimal: 2
-65535, decimal: 1
-65536, decimal: 65535
-65537, decimal: 65535
-65538, decimal: 65535
-65539, decimal: 65535
-3333333, decimal: 65535

От -1 до -65535, значение печати для символа, похоже, имеет шаблон.

От -65536 до любого меньшего отрицательного целого числа, значение печати для остатка 65535 все время me.

Ввод целого числа вне диапазона короткого замысла кажется очень простым правилом.

Ввод целого числа вне диапазона короткого знака без знака для начинающего, такого как я, затруднительно. понять сейчас.

Каковы правила печати беззнакового короткого значения после ввода целого числа вне диапазона беззнакового короткого?

1 Ответ

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

Просто добавив проверку, чтобы узнать, сигнализирует ли >> о проблеме:

#include <iostream>
#include <climits>

int main(void) {
    std::cout << USHRT_MAX << std::endl;
    unsigned short a;
    if (!(std::cin >> a))
      std::cout << "wrong ";
    std::cout << "decimal: " << a << std::endl;//decimal
    return 0;
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ g++ -Wall c.cc
pi@raspberrypi:/tmp $ ./a.out
65535
-1
decimal: 65535
pi@raspberrypi:/tmp $ ./a.out
65535
-2
decimal: 65534
pi@raspberrypi:/tmp $ ./a.out
65535
70000
wrong decimal: 65535
pi@raspberrypi:/tmp $ ./a.out
65535
-70000
wrong decimal: 65535
pi@raspberrypi:/tmp $

Фактически выдается сообщение об ошибке, если вы вышли из диапазон, но без учета подписанного / не подписанного

...