c++ - 如何在不强制转换的情况下捕获无符号值?

标签 c++ types casting signed

如何在不转换的情况下捕获 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/

相关文章:

c++ - C++ : Detecting mouse click on specific button 中的 Web 浏览器控件

c++ - 为什么 <cmath> 中的某些函数不在 std 命名空间中?

C++ 类型转换错误

c - "(type)variable"和 "*((type *)&variable)"之间有什么区别(如果有)?

swift - "as?"、 "as!"和 "as"之间有什么区别?

c++ - CoCreateInstance 不启动或连接到 ATL COM 服务

c++ - 比较从 C 中的套接字接收的字符串数据

types - OCaml 前向声明

C# 如何将对象列表传递给构造函数?

javascript - 从 jquery 对象获取 HTML 元素的类型