2010-09-07 110 views
-1

你能向我解釋爲什麼這不起作用:數據類型的問題

#include <iostream> 
using namespace std; 

double data_convert(int n); 

int main(void) { 
    cout << data_convert(sizeof(int)); 
} 

double data_convert(int n) { 
    int i; 
    double x; 

    x = 8 * n; 
    for(i = 0; i < 32; i++) 
     x = x * 32; 
    return x; 
} 

我嘗試使用POW從CMATH,但我得到了相同的結果。顯然,這輸出「4.67681e + 049」。它應該輸出的地方(使用Windows計算器)「4294967296」。

對於這個特定的任務,for循環是我自己的硬編碼pow()函數。我想要做的是製作一個程序,可以顯示數據類型有多大,以及它的範圍(位範圍或其他,是嗎?)

回答

6

如果你想要2^32,你應該每次乘以2。你的代碼每次乘以32,所以你最終會得到一個更大的值。

此外,您x值應該開始從1 8 * n實際上是在整數位的數量,所以這應該是循環的上限:

x = 1; 
for (i = 0; i < 8 * n; i++) 
    x = x * 2; 
return x; 

一個更簡單的方法是按位否定0,這將給你最大可能的整數:

return ~0; 

會給你2^32 - 1 = 4294967295(32位機器上)。

+1

並添加轉換任何整數數據類型,需要測試應該工作,我想。 – 2010-09-07 16:45:04

+0

不錯,難怪我在高中數學不及格。非常感謝 – Christopher 2010-09-07 16:49:29

+1

'〜0'是錯誤的。首先,你認爲你的整數是用二進制補碼錶示的,這是他們不能的。即使如此,OP所尋找的數字也不能表示爲「int」,而只能表示爲「unsigned int」。 '(無符號)-1'應該是始終有效的答案。在二進制補碼中,你給出的數字是(int)-1。 – 2010-09-07 19:14:59

0

我不確定你在做什麼,但是你的意思是x = x*2

1

基本上你將輸入乘以8,然後乘以32,32次。

我不明白那是什麼讓你。

如果你想你應該使用該計算的字節x量的無符號整數的範圍:

最大數量= 2 ^(字節* 8) - 1

所以在環路它應該乘2,直到我從0到字節* 8,並停在那裏(所以它結束之前,它得到字節* 8)