我正在研究这个简短的算法,它提示用户输入一个整数,输出将是整数占用的位数:但是当我输入非常大的数字时,输出变为负数。我不希望有负面的输出。我怎样才能解决这个问题?还有更好的方法来应用这个过程吗?
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 :(得分:0)
您可以使用%u而不是%d打印数字的unsigned int版本。 您的问题源于“int”类型限制为4个字节的内存,并且您以指数方式递增(通过添加myMultiplier),因此它对于4个字节来说太大了所以它会让事情变得混乱。
答案 1 :(得分: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。
答案 2 :(得分:0)
还有更好的方法来应用这个过程吗?
一种更好的方法(对于正数)是将数字转换为无符号数,然后计算将其减少到零所需的右移数。如果从零开始,这是一种特殊情况,答案是1位。
负数更有问题,你算1或0吗?在第一种情况下,答案是“类型的位宽”,但是1的一些只是符号扩展位,它们真的算了吗?在第二种情况下,只需转换为无符号,取按位否定并重复正数的过程。
答案 3 :(得分:0)
使用libmath这是另一种选择:
printf( "Top Value %u \n",
(unsigned int) exp2((double) numberHowBig)-1 );