2010-09-07 115 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)