Как я могу захватить значение unsigned
без приведения?
Я пишу простую программу для вычисления LCF и GCD из массива чисел.Чтобы правильно рассчитать их, числа должны быть всегда положительными интергерсами, для которых я выбрал тип "unsigned long long int
".Однако я до сих пор не нашел способа запретить пользователю вводить отрицательное значение без приведения.
Всякий раз, когда я использую std::cin >> variable
, программа позволяет пользователю вводить отрицательное число,В случае значений без знака число будет значением диапазона минус значения размера.В случае unsigned short
interger, если пользователь вводит -5
, значение, хранимое в переменной, будет 65.531
.
Вот часть кода, которую я пытаюсь улучшить:
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef unsigned long long int ulli;
/* many lines of code, variables already declared */
// array_list_of_numbers is of type UNsigned long long int
// var_verify_if_negative is of type signed long long int
cout << "Please inform the numbers." << endl;
for ( iterador1 = 0 ; iterador1 < size_of_the_list ; ++iterador1){
cout << "Please, inform number "<< iterador1+1 << ": ";
cin >> var_verify_if_negative;
while (var_verify_if_negative <= 0){
cout << "Number must be equal or greater than 1!" << endl;
cout << "Try again: ";
cin >> var_verify_if_negative;
/*end while*/}
array_list_of_numbers[iterador1] = (ulli)var_verify_if_negative; // << here is the casting
/*end for*/}
Однако, если я использую приведение переменной со знаком, нет смысла использовать тип данных без знака вообще.Было бы лучше объявить переменные уже как подписанные и выполнить проверку.
Исходный код был:
cout << "Please inform the numbers." << endl;
for ( iterador1 = 0 ; iterador1 < size_of_the_list ; ++iterador1){
cout << "Please, inform number "<< iterador1+1 << ": ";
cin >> array_list_of_numbers[iterador1];
/*end for*/}
, который допускает неправильный ввод.Как я могу проверить, вводил ли пользователь значение со знаком, используя std::cin
?