2012-12-22 18 views
-1

爲什麼我收到異常異常爲32位數字C++

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; 
} 
+1

A 4294967295位數?如果你的意思是你輸入的值,[它工作正常](http://ideone.com/jLRfnQ)。 –

回答

2

雙不起作用。它是一個帶有字段和特定格式的結構(稱爲IEEE double precision)。並非所有的64位都可用於尾數。

然而,它應該已經吃了你輸入的數字(4294967295)。你確定這是你放的嗎?你所引用的程序是什麼 - 全部是?

+0

我更新了問題。給定函數被調用時,我會得到異常。 – Alfred

+0

(2^32)-1 = 429496725 – Alfred

+0

未找到AfterDecimal1標識符。無論如何,你的例外與雙打無關。這可能是寫給這個未知的AfterDecimal1 –

0
remainderA = a - (int)a; 

在32位機這裏的結果是不確定的,如果A> 429496725.嘗試打印出來remainderA,我打賭這是大,導致HFN到緩衝區溢出。

0

您正在用盡陣列邊界。

X ++是永遠做,直到它大於64

在上面代碼中,我們沒有理由對其餘永遠成爲一也。將double與==比較是不正確的。它僅適用於整數運算。