2017-03-14 36 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);