溢出/下溢问题?

时间:2014-07-10 00:12:42

标签: c++

我应该编写一个可以将十进制数转换为二进制数的程序。我有转换工作的代码,但是当我尝试使用if / else语句输入超出我的类型(unsigned short)的max / min的数字时发送错误。当我输入应该是无效数字的程序时,程序跳转到转换语句并打印最大二进制数(如果输入超过655355的数字)或将从最大数字向下倒计数(如果输入负数)。

我认为写得正确。

#include <iostream>
#include <cmath>
#include <climits>
using namespace std;

// This converts the number to binary, it divides the imputed number by two, printing the reminders//

void bin(unsigned short nub)
{
    if (nub <=1)
    {
        cout << nub;
        return;
    }

    unsigned short rem;
    rem = nub % 2;
    bin( nub / 2);
    cout << rem;
}

int main()
{
    unsigned short dd;
    unsigned short bigNumber = pow(2,sizeof(unsigned short)*8)-1;

    cout << "\nPlease enter an unsigned short int between 0 and " << bigNumber << ": ";
    cin >> dd;


    //Should be printed if user imputs a number larger than the data type//

    if ( dd > bigNumber )
    {
        cout << "\nThe number is invalid. Please try again.\n\n";
    }

    //Should be printed if user imputs a negative number//

    else if (dd < 0)
    {
     cout << "\nThe number is invalid. Please try again.\n\n";
    }

    //Prints the binary number//

    else
    {
        cout << "\nThe Binary version of " << dd << " is ";
        bin(dd);
        cout << endl << endl;
    }


    return 0;
}

4 个答案:

答案 0 :(得分:1)

你自己遇到了溢出。使用能够保存大于65535的值的dd的另一种数据类型(例如unsigned int)。

答案 1 :(得分:0)

您遇到溢出问题,尤其是无符号数字。

这是你的第一个问题:

    unsigned short dd;
    // ...
    else if (dd < 0)

您已声明dd未签名,因此这是无意义的比较。

接下来,你已经完成了

    if(dd > bigNumber)

其中bigNumberunsigned short可以容纳的最大值。同样,这是一个毫无意义的比较。要解决此问题,您需要使dd成为更大的数据类型;为什么不使用unsigned int

最后,一个风格提示。请使用pow(2,sizeof(unsigned short)*8)-1中提供的USHRT_MAX,而不是使用怪异的<climits>装置。

答案 2 :(得分:0)

问题在于您正在比较已溢出dd。它永远不会超过它可以容纳的最大值。

正如其他人建议您可以为dd使用更大的数据类型,但在某些情况下也可以使用“{1}}”。溢出。

想象一下,输入的值足够大,甚至可以溢出unsigned int(或任何其他)。你会遇到同样的问题。不太频繁,但你会有。

没有简单的方法可以阻止这种情况,您可以查看this question的答案,了解如何做到这一点。

答案 3 :(得分:0)

如果输入对于数据类型来说太大,则流将进入故障状态。因此,您可以检查故障状态。您现有的代码没有这样做;在这种情况下它会做什么,对未初始化变量bin中的垃圾做dd

以下是一些示例代码,实际上是使用循环(您的代码说&#34;请再试一次&#34;然后退出!):

for (;;)
{
    cout << "Please enter a number between 0 and " << USHRT_MAX << ": ";
    cin >> dd;

    if ( !cin )
    {
        if ( cin.eof() )
            break;                    // exit loop entirely if the input is closed

        cout << "Not a valid unsigned short, please try again\n";
        cin.clear();                  // cancel the failure state
        string s; getline(cin, s);     // discard rest of line
        continue;
    }

    cout << "The Binary version of " << dd << " is ";
    bin(dd);
    cout << endl;
    break;
}

如果您想使用比0 ... USHRT_MAX更有限的范围,您可以将if ( !cin )更改为if ( !cin || dd < 12345 )