Обнаружить целочисленное переполнение на входе

Есть ли способ в C или C ++ проверить, находится ли число, предоставленное пользователем, вне диапазона целочисленного типа?

Например, предположим, что мы используем 16-разрядные целые числа со знаком в диапазоне от -32768 до 32767.

Если пользователь вводит 55555 в программу, оно будет перенесено в отрицательное число, так что если вы используете функцию, которая может принимать любое число, результат будет неверным.

Есть ли способ в C или C ++ определить, находится ли число, предоставленное пользователем, в диапазоне целочисленного типа?


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

0

Решение

Если пользователь вводит 55555 в программу, оно будет перенесено в отрицательное число

Не всегда. Это зависит от того, как вы читаете номер. Если вы используете, operator>>Например, это значение будет не быть завернутым, он будет отклонен.

Есть ли способ в C или C ++ определить, находится ли число, предоставленное пользователем, в диапазоне целочисленного типа?

В C ++ просто используйте operator>>:

#include <iostream>
int main() {
signed short int i;
std::cin >> i;
if(std::cin)
std::cout << "You entered a valid number!\n";
else
std::cout << "Aw c'mon, play by the rules.\n";
}
3

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

Если вы используете что-то вроде strtol это установит errno в ERANGE если происходит переполнение

5

Есть ли способ в C или C ++, чтобы проверить, является ли число, предоставленное
пользователь находится вне диапазона целочисленного типа?

Это зависит от того, какую функцию вы используете (strtol может сделать это например). Проверьте документацию.

0

Единственная разница между int и uint в том, как их интерпретировать. Ваша проблема не имеет решения, если она настолько критична для вас, как переключение на аргумент с плавающей запятой, проверку значения и приведение типов. Обновление: я думал, что вы хотите, чтобы значение аргумента функции проверки во время выполнения было предоставлено другим программистом, а не консольным вводом.

0
По вопросам рекламы [email protected]