c++ - 为什么结果是负数?
c++ - why the result is minus?
我的简单程序有一些问题,如果我的输入大于 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,但还是一样。
我想知道为什么?
如何解决?
你试过了吗
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;
}
一个整数可以存储的最大正数是 2147483647 (2^31 - 1)。
仅将 1 添加到该数字将导致值 -2147483648 (- 2^31).
所以答案是你在使用 int 时发生了溢出。
因此,您需要 long long int 或更好的 unsigned long long。
unsigned 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
unsigned 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 从最大正值溢出。
另请参阅此 link http://www.cplusplus.com/reference/climits/
295600128 十进制是八进制的 2147500000。当您尝试将 2147500000 作为十进制数放入 int
时,它会溢出 4 字节有符号限制,从而得到负值。
一个问题 - 为什么要将八进制数作为十进制数存储回变量中?如果你只想显示数字,你已经在 A
.
中了
如果您只想将数字显示为八进制,std::ostream 已经可以这样做了:
std::cout << std::oct << b << '\n';
如果出于某种原因您确实需要整数变量中八进制数的十进制表示,则需要将 c
和 kali
更改为 long long。
我的简单程序有一些问题,如果我的输入大于 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,但还是一样。
我想知道为什么?
如何解决?
你试过了吗
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;
}
一个整数可以存储的最大正数是 2147483647 (2^31 - 1)。 仅将 1 添加到该数字将导致值 -2147483648 (- 2^31).
所以答案是你在使用 int 时发生了溢出。 因此,您需要 long long int 或更好的 unsigned long long。
unsigned 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
unsigned 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 从最大正值溢出。
另请参阅此 link http://www.cplusplus.com/reference/climits/
295600128 十进制是八进制的 2147500000。当您尝试将 2147500000 作为十进制数放入 int
时,它会溢出 4 字节有符号限制,从而得到负值。
一个问题 - 为什么要将八进制数作为十进制数存储回变量中?如果你只想显示数字,你已经在 A
.
如果您只想将数字显示为八进制,std::ostream 已经可以这样做了:
std::cout << std::oct << b << '\n';
如果出于某种原因您确实需要整数变量中八进制数的十进制表示,则需要将 c
和 kali
更改为 long long。