max unsigned int的反向数字

时间:2014-04-25 07:56:27

标签: c unsigned-integer

我尝试编写一个用于反转用户输入编号的程序。

用户输入范围是从0到0。 a< 4294967295, 这是 EDITED 代码。

unsigned long int reverseNumber(unsigned long int num)
{
    unsigned long int rev = 0;

    while (num > 0)
    {
        rev = rev *10 + (num%10);
        num = num/10;
    }

    return rev;
}

问题是当我输入4294967295时,它会输出1632727628。 为什么?我不知道为什么会这样。 如何撤消4294967295。

我使用%lu将其更改为unsigned long int,printf,但仍然输出1632727628.为什么?

3 个答案:

答案 0 :(得分:7)

4294967295的反面是5927694924,大于unsigned int

的范围

在您的系统中,unsigned int的宽度为32-bit,因此unsigned int可以表示的最大值为4294967295,即0xFFFFFFFF。这就是为什么你的结果溢出而且32位中剩余的任何内容都显示为输出。

如果您以十六进制表示5927694924,则0x16151724C具有额外的33rd1,将其丢弃,因此输出为0x6151724C十进制1632727628

要在屏幕上打印它,您需要更大的数据类型,如unsigned long longuint64_tunsigned long(仅限64位系统),无论您的编译器支持{{1} }位整数。

答案 1 :(得分:2)

4294967295的反向是5927694924,大于4294967295,这是可以存储在32位的最大整数。

答案 2 :(得分:2)

  

问题是当我输入4294967295时,它会输出1632727628.为什么?

unsigned int可以存储最多2^32-1个。 4294967295的反面是5927694924,它比2^32-1大得多。因此,输出为16327276281632727628实际上是5927694924 % 4294967296

要解决此问题,您应该使用unsigned long it。但是,如果这个数字比最高数字长,它又会再次溢出。