2014-04-25 35 views
1

我尝试编写一个反转用户输入数字的程序。最大无符号整数的反向数字

用户输入范围是从0 <一个< 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.为什么?

+4

发生整数溢出 – thumbmunkeys

+0

只需将int转换为char数组并从头开始打印即可。 – someuser

+0

但我把它改为unsigned long int,它仍然输出相同的答案。为什么? – user2301281

回答

2

4294967295的反码是5927694924,它大于4294967295,它是可存储在32位上的最大整数。

+0

但我把它改为unsigned long int,它仍然输出相同的答案。为什么? – user2301281

+2

@ user2301281因为'unsigned long int'也是32位。您需要更改为'unsigned long long int',它是64位。 – peterh

+0

不,我更改为无符号long long int它输出547093574220. – user2301281

7

4294967295反向是5927694924这比unsigned int

在系统中的范围时,unsigned int32-bit宽,因此最大值,一个unsigned int可以表示是42949672950xFFFFFFFF。这就是为什么你的结果溢出并且32位中的任何剩余都显示为输出。

如果您代表十六进制5927694924,它是0x16151724C具有额外33rd1,这被丢弃,因此输出为0x6151724C即十进制数1632727628

要打印在屏幕上,你需要像unsigned long longuint64_tunsigned long更大的数据类型(仅64位系统),无论你的编译器支持64位整数。

+0

感谢提醒,我忘了它。 – user2301281

+1

不,这不仅仅是简单的减法(但在这种情况下,结果可能相同)。它实际上是模数,即'5927694924%4294967295'。 –

+0

明白了,谢谢大家!! = D – user2301281

2

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

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

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

+0

只适用于32位系统 – thumbmunkeys

+0

但我将它更改为unsigned long int,它仍输出相同的答案。为什么? – user2301281

+0

@ user2301281因为'unsigned long'通常和'unsigned int'是一样的东西 –