【发布时间】:2019-07-23 21:04:45
【问题描述】:
如何在不强制转换的情况下捕获 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 输入了签名值?
【问题讨论】:
-
不要使用无符号类型。仅仅因为数字不能为负并不意味着您应该使用无符号类型。对位操作使用无符号,对其他一切使用有符号,除非你真的需要那个额外的位。如果你使用有符号类型,那么检查你是否得到一个负数是微不足道的。