c ++ - 为什么结果是减号?

时间:2015-04-25 07:58:42

标签: c++ octal

我的简单程序有问题,如果输入超过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,但它是相同的。
我想知道一些原因吗?
以及如何解决?

2 个答案:

答案 0 :(得分:3)

295600128十进制是八进制是2147500000.当您尝试将2147500000作为十进制数放入int时,它会溢出4字节的有符号限制,这会给出负值。

一个问题 - 为什么要将八进制数存储在变量中作为十进制数?如果您只想显示该号码,则已在A中显示该号码。

如果您只想将数字显示为八进制,std :: ostream可以执行此操作:

std::cout << std::oct << b << '\n';

如果出于某种原因,您确实需要在整数变量中使用十进制数字的十进制表示,则需要将ckali更改为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来显示如何从最大正值溢出。

另请参阅此链接http://www.cplusplus.com/reference/climits/