32位数C ++的例外

时间:2012-12-22 13:56:41

标签: c++ exception double

为什么会出现异常

Unhandled exception at 0x00000001 in TestingCOA.exe: 0xC0000005: Access violation (parameters: 0x00000008).

当我尝试使用4294967295或更高的号码时。在我的机器sizeof上,double是8bytes,应该能够处理和使用2^64 -1数字,但它会为32位数生成异常,为什么会这样?

int main()
{
  double n,remainderA;
  int AfterDecimal1[64],RemExponent1;

  cout<< "Enter number\n";
  cin>> n;

  remainderA=a-(int)a;

   HandleFractionNumber(remainderA,AfterDecimal1,RemExponent1);
}


int HandleFractionNumber(double remainder,int (&Goku)[64],int &RemExponent)
{
int x=0;
for(int i=0;;i++)
{
    remainder*=2;
    if(remainder>1)
    {
        remainder-=1;
        Goku[x]=1;
        x++;
    }
    else
        if(remainder<1)
        {
            Goku[x]=0;
            x++;
        }
        if(remainder==1)
        {
            Goku[x]=1;
            break;
        }
        RemExponent=x;
}

3 个答案:

答案 0 :(得分:2)

Double并不像那样。它是一个具有字段和特定格式的结构(称为IEEE double precision)。并非所有64位都可用于尾数。

然而,它应该在输入时吃掉你提到的数字(4294967295)。你确定这是你放的吗?你引用的程序是否全部?

答案 1 :(得分:0)

remainderA = a - (int)a;

在32位计算机上,如果a> gt,则此处的结果是不确定的。 429496725.尝试打印remainderA,我打赌它很大,导致HFN超出缓冲区。

答案 2 :(得分:0)

你的阵列边界已经不多了。

x ++永远完成,直到大于64.

在上面的代码中,没有理由让剩余部分也成为一个。将double与==进行比较是不正确的。它仅对整数算术可靠地起作用。