2017-03-14 38 views
-3

我正在处理这个简短的算法,它提示用户键入一个整数,输出将是整数需要多少位:但是,当我输入非常大的数字时,输出变为负数。我不希望产生负面结果。我怎样才能解决这个问题?还有更好的方法来应用这个过程?计算一个整数需要多少位C

int numberHowBig =0; 
printf("How many Bits? "); 
scanf(" %d", &numberHowBig); 
printf("n\n"); 


int myIncrementor = 1, myMultiplier = 1, 
    finalValue = 1; 
while (myIncrementor < numberHowBig){ 
    myMultiplier *=2; 
    finalValue = finalValue + myMultiplier; 
    myIncrementor++; 
} 
if ((numberHowBig == 0) || (numberHowBig == 1)){ 
    printf("Top value: %d\n\n", numberHowBig); 
} else { 
    printf("Top value: %d\n\n", finalValue); 
} 
+0

尝试'long'和格式说明'%ld'。除非以字符串的形式读取数字,否则将始终存在机器限制。 –

+0

您必须采取溢出,'int'被签名的事实以及可以适合您所选类型的最大数字。请注意,您可以简单地将该数字移至右侧,并计算需要多少次移位才能使其获得相同的结果,例如:int s = 0; while(number >> = 1)++ s;' – Jack

回答

0

您可以使用%u而不是%d打印数字的无符号整数版本。 你的问题来自于“int”类型限制为4字节的内存,并且你指数增加(通过添加myMultiplier),所以它变得太大,4字节,所以它搅乱了事情。

+1

'int'不是“限制为4个字节”,但必须至少为16位宽,且在标准中没有指定上限。 –

0

是的,还有更好的办法。您可以使用位这样的转变:

if ((numberHowBig == 0) || (numberHowBig == 1)){ 
    printf("Top value: %d\n\n", numberHowBig); 
} else { 
    int finalValue = (1 << numberHowBig) - 1; 
    printf("Top value: %d\n\n", finalValue); 
} 

如果你想能够处理更大的输出,使用更大的datatype

0

也有更好的方法来应用这个过程吗?

一个更好的方法(对于正数)是将数字转换为无符号数,然后计算将其减少到零所需的右移量数。如果你从零开始,那是一个特例,答案是1位。

负数更成问题,你数1还是0?在第一种情况下,答案是“类型的位宽”,但是1中的一些将仅仅是符号扩展位,它们是否真的数过?在第二种情况下,只需将其转换为无符号数,然后进行按位取反,并对正数重复该过程。

+0

@PaulOgilvie我会的。我认为这是假设2的补码表示。 – JeremyP

0

使用libmath这是一种替代:

printf("Top Value %u \n", 
    (unsigned int) exp2((double) numberHowBig)-1);