整数范围和溢出

时间:2014-09-24 14:10:29

标签: 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)
{
    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;

}

4 个答案:

答案 0 :(得分:4)

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

希望有所帮助。

答案 1 :(得分:0)

实际上,整数的范围在[-2 ^ 31,2 ^ 31-1]之间。因为有4个字节(即32位)。但是,如果要扫描非负整数。你必须初始化一个unsigned int而不是int。范围将是[0,2 ^ 32-1]。

答案 2 :(得分: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没有溢出。

答案 3 :(得分:0)

您似乎想要一个4字节的十进制数并将其转换为0和1的二进制字符串。当十进制数> 1时,代码中使用的方法失败。这是一个转换,它产生一个0和1的字符串,可以使用:

打印
printf("\nBinary Equivalent is: ");

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

这消除了大部分代码混乱并产生了所需的输出。