我应该编写一个可以将十进制数转换为二进制数的程序。我有转换工作的代码,但是当我尝试使用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;
}
答案 0 :(得分:1)
你自己遇到了溢出。使用能够保存大于65535的值的dd
的另一种数据类型(例如unsigned int)。
答案 1 :(得分:0)
您遇到溢出问题,尤其是无符号数字。
这是你的第一个问题:
unsigned short dd;
// ...
else if (dd < 0)
您已声明dd
未签名,因此这是无意义的比较。
接下来,你已经完成了
if(dd > bigNumber)
其中bigNumber
是unsigned 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 )
。