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';

如果出于某种原因您确实需要整数变量中八进制数的十进制表示,则需要将 ckali 更改为 long long。