我的简单程序有问题,如果输入超过295600127,结果是减号( - )。
这里:
#include <iostream>
#include <windows.h>
using namespace std;
int konarray(int b);
void konbil(int A[], int &n);
int kali(int x);
main(){
int b;
char *awal,akhir,pil;
awal:
system("COLOR 9F");
cout<<"enter decimal\t= ";cin>>b;
//calling function of conversion to an array of integers
konarray(b);
akhir:
cout<<"\n\nDo You Want To Reply Now ? (Y/N) : ";
cin >> pil;
cout<<endl;
switch(pil){
case 'Y' :
case 'y' :
system ("cls");
goto awal;
break;
case'N':
case 'n' :
break;
default:
system("COLOR c0");
system ("cls");
cout << "Please, make sure for entering the choise!!\n\n\n\n";
goto akhir;
}
}
//convertion numer to array
int konarray(int b){
int A[30];
int i,n,h,s;
i=0;
do{
h=b/8;
s=b%8;
b=h;
A[i]=s;
i++;
}
while(h!=0);
n=i;
for(i=0;i<n;i++)
cout<<A[i]<<" ";
konbil(A,n);
}
//array to octal
void konbil(int A[],int &n){
int c,i;
c=A[0];
for(i=1;i<n;i++)
c=c+A[i]*kali(i);
system("COLOR f0");
cout<<endl<<"the results of the conversion are\t= ";
cout<<c<<endl;
}
int kali(int x){
if (x==1)
return (10);
else
return(10*kali(x-1));
}
我已尝试将所有int更改为long,但它是相同的。
我想知道一些原因吗?
以及如何解决?
答案 0 :(得分:3)
295600128十进制是八进制是2147500000.当您尝试将2147500000作为十进制数放入int
时,它会溢出4字节的有符号限制,这会给出负值。
一个问题 - 为什么要将八进制数存储在变量中作为十进制数?如果您只想显示该号码,则已在A
中显示该号码。
如果您只想将数字显示为八进制,std :: ostream可以执行此操作:
std::cout << std::oct << b << '\n';
如果出于某种原因,您确实需要在整数变量中使用十进制数字的十进制表示,则需要将c
和kali
更改为long long。
答案 1 :(得分:2)
你试过吗
long long int
这个程序
int main(int argc, char** argv)
{
cout << sizeof(int) << endl;
cout << sizeof(long int) << endl;
cout << sizeof(long long int) << endl;
return 0;
}
给出
4
4
8
显示你需要long long int来获得64位
像这样改变:
void konbil(int A[],int &n){
unsigned long long c,i; // unsigned long long
c=A[0];
for(i=1;i<n;i++)
c=c+A[i]*kali(i);
system("COLOR f0");
cout<<endl<<"the results of the conversion are\t= ";
cout<<c<<endl;
}
您可以在int中存储的最大正数是2147483647(2 ^ 31 - 1)。 仅向该数字添加1将导致值-2147483648( - 2 ^ 31)。
所以答案是你在使用int时有溢出。 因此,您需要long long int或更好的unsigned long long。
无符号长long不能为负数并允许最大值(2 ^ 64 - 1)。
编辑: 评论中添加了一个额外的问题 - 因此编辑。
INT
在大多数系统中,int是32位。
它可以取-2 ^ 31到2 ^ 31-1的值,即从-2147483648到2147483647
unsigned int
unsigned int也是32位。但是unsigned int不能是负数。
相反,它具有0到2 ^ 32-1的范围,即从0到4294967295
long long int
当你使用long long int时,你有64位。
所以有效范围是-2 ^ 63到2 ^ 63-1,即-9223372036854775808到9223372036854775807
unsigned long long
无符号长long也是64位但不能为负。
范围是0到2 ^ 64-1,即0到18446744073709551615
试试这段代码:
int main()
{
cout << endl << "Testing int:" << endl;
int x = 2147483647; // max positive value
cout << x << endl;
x = x + 1; // OVERFLOW
cout << x << endl;
cout << endl << "Testing unsigned int:" << endl;
unsigned int y = 4294967295; // max positive value
cout << y << endl;
y = y + 1; // OVERFLOW
cout << y << endl;
cout << endl << "Testing long long int:" << endl;
long long int xl = 9223372036854775807LL; // max positive value
cout << xl << endl;
xl = xl + 1; // OVERFLOW
cout << xl << endl;
cout << endl << "Testing unsigned long long:" << endl;
unsigned long long yl = 18446744073709551615ULL; // max positive value
cout << yl << endl;
yl = yl + 1; // OVERFLOW
cout << yl << endl;
return 0;
}
它会给你
Testing int:
2147483647
-2147483648
Testing unsigned int:
4294967295
0
Testing long long int:
9223372036854775807
-9223372036854775808
Testing unsigned long long:
18446744073709551615
0
通过仅添加1来显示如何从最大正值溢出。