C 整数范围和溢出

C 整数范围和溢出,c,error-handling,mingw,integer-overflow,C,Error Handling,Mingw,Integer Overflow,这是一个将十进制正数转换为二进制数的简单程序。我必须报告并停止转换可能导致溢出或错误结果的数字。我发现整数的大小是4字节,但它只能正确转换为1023字节。 我不知道1023是从哪里来的?如果我在另一个系统上编程,是否有任何方法可以计算出正确的范围 #include<stdio.h> int main(void) { int decimal,binary=0,y,m=1; scanf("%d",&decimal); if(decimal<=1023) { whil

这是一个将十进制正数转换为二进制数的简单程序。我必须报告并停止转换可能导致溢出或错误结果的数字。我发现整数的大小是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;

}1023等于1024-12^10-1,因此小于或等于1023的数字在基数2中有10位数字。由于使用int来获取结果,因此它最多存储2^31-1=2147483647 31,因为32位中的一位用于表示符号+或-。当您有1024或更高的数字时,它使用的数字超过10位,因此高于2147483647


希望有帮助

实际上,整数的范围在[-2^31,2^31-1]之间。因为有4个字节,即32位。但是,如果要扫描非负整数。您必须以无符号int而不是int开头。范围将是[0,2^32-1]。

问题在于您使用的临时变量二进制和m。因为1024需要11个师才能变成0,所以m将变成10.000.000.000。但是,int的最大值为2.147.483.647,因为四个字节中的一位用作符号位。m将因此溢出,从而导致错误的结果。1023或更小的值将需要10个或更少的除法才能变为0,因此m最大值为1.000.000.000,因此m没有溢出。

您似乎希望获取一个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");
这消除了大量的代码混乱,并产生了所需的输出。

可以使用ifdecimal