2014-09-24 49 views
2

這是一個將正數十進制數轉換爲二進制數的簡單程序。我必須報告並停止轉換那些可能導致溢出或錯誤結果的數字。我發現整數的大小是4字節,但它只能正確轉換爲1023。 我很混淆數字「1023」從何而來?有沒有什麼方法可以計算,所以我可以預測什麼是正確的範圍,如果說,我正在另一個系統上編程。整數範圍和上溢

#include<stdio.h> 
int main(void) 
{ 
int decimal,binary=0,y,m=1; 
scanf("%d",&decimal); 
if(decimal<=1023) 
{ 
    while(decimal>0) 
{ 
    y=decimal%2; 
    binary=binary+(m*y); 
    m=m*10; 
    decimal=decimal/2; 
} 
printf("\nBinary Equivalent is: %d",binary); 
} 
else 
    {printf("Sorry, The Number You've entered exceeds the maximum allowable range for  conversion");} 
getch(); 
return 0; 

}

+0

可以_使用if(decimal <= 2047)... m = m * 8; ...「二進制等效爲:%o」'多一位數字。 – chux 2014-09-24 16:12:37

回答

4

1023等於1024-1(2^10 -1),因此數大於或等於1023較輕將有10位數字在基座2。由於使用的是int爲了得到結果,它存儲最多2^31-1 = 2147483647(31,因爲32位中的一個用來表示符號(+或 - ))。當您擁有1024或更高的號碼時,它將使用多於10位的數字,因此高於2147483647.

希望有所幫助。

0

實際上,一個整數的範圍在[-2^31,2^31-1]之間。因爲有4個字節(即32位)。但是,如果您想掃描一個非負整數。你必須先初始化一個unsigned int而不是int。範圍將是[0,2^32-1]。

0

問題出在您使用的臨時變量binarym。因爲1024將需要11個分區變成0,所以m將變成10.000.000.000。但是,int的最大值是2.147.483.647(因爲四個字節中的一位用作符號位)。 m將因此溢出,這導致不正確的結果。 1023或更小的值將需要10個或更少的值才能變爲0,所以m最大爲1.000.000.000,所以m沒有溢出。

0

你似乎想要一個4字節的十進制數並將其轉換爲0和1的二進制字符串。在代碼中所使用的方法中,當十進制數爲1023失敗>以下是產生0和1組成的字串,可以使用印刷的轉化:

printf("\nBinary Equivalent is: "); 

while(int i = 0; i < 32; i++) 
{ 
    printf("%c", (decimal & (1<<i))? '1': '0'); 
} 
printf("\n"); 

這消除了許多碼雜波併產生期望的輸出。