2014-09-24 110 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"); 

这消除了许多码杂波并产生期望的输出。