C++ 如何在不强制转换的情况下捕获未签名的值?
如何在不强制转换的情况下捕获C++ 如何在不强制转换的情况下捕获未签名的值?,c++,types,casting,signed,C++,Types,Casting,Signed,如何在不强制转换的情况下捕获未签名的值 我正在写一个简单的程序来计算一组数字的LCF和GCD。为了正确地计算它们,数字应该始终是正整数,因为我选择了类型“unsigned long long int”。但是,我仍然没有找到一种方法来防止用户在不进行强制转换的情况下输入负值 每当我使用变量时,程序允许用户输入负数。对于无符号值,数字将是类型大小的范围减去值。如果是无符号short整数,如果用户输入-5,则变量中存储的值将为65.531 以下是我试图改进的代码部分: #include<iost
未签名的值
我正在写一个简单的程序来计算一组数字的LCF和GCD。为了正确地计算它们,数字应该始终是正整数,因为我选择了类型“unsigned long long int
”。但是,我仍然没有找到一种方法来防止用户在不进行强制转换的情况下输入负值
每当我使用变量时,程序允许用户输入负数。对于无符号值,数字将是类型大小的范围减去值。如果是无符号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*/}
#包括
#包括
使用名称空间std;
typedef无符号长整型ulli;
/*许多行代码、变量已经声明*/
//_数的数组_list_的类型为无符号长整型
//var_验证_负数是否为带符号的long int类型
cout不幸的是,没有特定的提取器会拒绝标准流中的有符号整数,相反,有符号整数会转换为无符号值(这实际上是负数的未定义行为)
然而,您的整个方法有些缺陷。如果你想禁止小于0的数字,你能做的最好的事情就是实际接受带符号的整数,然后检查数字是否大于零,如果不大于零,则报告错误(并拒绝输入)。为什么不简单地读取(带符号的)长字符,当其为负数时拒绝它,否则就使用它呢
如果您确实需要无符号长字符的完整范围,则需要首先读取字符串,检查它是否以“-”(并拒绝)开头,否则转换为无符号长字符。最好的情况是,当预期类型为无符号类型时,当输入负数时,流提取器会报告失败
unsigned int num;
while ( !(in >> num) )
{
std::cerr << "Wrong input. Try again...";
}
unsigned int num;
而(!(in>>num))
{
cerr不使用无符号类型。数字不能为负数并不意味着您应该使用无符号类型。除非您确实需要额外的位,否则在位操作中使用无符号,在其他所有操作中使用有符号。如果使用有符号类型,则检查是否得到负数是很简单的。其思想是使用u的整个范围nsigned LLI。您使用字符串的想法似乎是解决此问题的正确方法,即使非常大的数字也会在程序中造成错误。
unsigned int num;
while ( !(in >> num) )
{
std::cerr << "Wrong input. Try again...";
}