如何在不转换的情况下捕获 unsigned
值?
我正在编写一个简单的程序来计算数字数组的 LCF 和 GCD。为了正确计算它们,数字应始终为正整数,因为我选择了类型“unsigned long long int
”。但是,我仍然没有找到一种方法来阻止用户输入负值而无需转换。
每当我使用 std::cin >> variable
时,程序都允许用户输入负数。在无符号值的情况下,数字将是类型大小的范围减去值。在 unsigned short
整数的情况下,如果用户输入 -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
输入了带符号的值?
最佳答案
为什么不简单地读取一个(带符号的)long 并在它为负时拒绝它并在其他情况下使用它?
如果你真的需要一个 unsigned long 的完整范围,你需要先读取一个字符串,检查它是否以 '-' 开头(并拒绝),否则转换为 unsigned long。
关于c++ - 如何在不强制转换的情况下捕获无符号值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54951270/