反转5位数字给出负数

时间:2014-07-04 13:35:06

标签: c

这是我用来反转数字的程序。但是当我输入5位数作为输入时,有时候答案是正确的,有时是正面的。

#include<dos.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>


int main()
{
    clrscr();
    int a,b,c;
    b=0;
    printf("Enter the no");
    scanf("%d",&a);
    c=a;
    while(a>0)
    {
        b=(b*10)+(a%10);
        a=a/10;
    }
    printf("\noriginal no %d",c);

    printf("\nreversed no is %d",b);
    getch();
    return 0;
}

如果输入:12111
   输出:11121

输入:22333
   输出:-32214

整数的限制是从-32768到32767,那么为什么答案是否定的? 我尝试使用很长时间,但我的反转数字为0。

3 个答案:

答案 0 :(得分:4)

看起来这是一个16位的DOS程序?所以你的int只有16位/ 2字节,你的程序溢出它。

你可以尝试检测这种情况何时会发生,和/或使用unsigned来避免负数或使用long代替int来存储更大的值(尽管此程序仍然存在如果你溢出,输出错误的答案。)

总体目标是什么? - 您可以通过反转字符串来实现吗?

答案 1 :(得分:3)

正如Bathsheba所说,sizeof(int)显然是2,并且考虑到你正在使用的标题,平台是MS-DOS,这意味着你的int只有16位信息可用。因为第一位是符号位,所以留下15位,2 ^ 15是32768,这意味着你的范围是-32767 .. + 32767。您想要的是unsigned int%u scanfprintf。这将允许您使用0..65535。

需要能够处理所有5位数字吗?切换到long代替(除了分别使用%ld%lu签名或未签名之外,如果您签名或签名无关紧要),您将拥有-2147483648 .. +2147483647(签名)或0..4294967295(无符号),这将为您提供5位数字的足够范围。

如果您在使用long时出现问题且scanf和printf的格式正确,则问题在于您的逻辑,而不是至少读取数字。

答案 2 :(得分:2)

如果限制为32767,则反转22333将产生33322,这大于限制!!!

如果您想使用long代替int,那么您还应该使用"%ld"代替"%d"