我尝试编写一个用于反转用户输入编号的程序。
用户输入范围是从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.为什么?
答案 0 :(得分:7)
4294967295
的反面是5927694924
,大于unsigned int
在您的系统中,unsigned int
的宽度为32-bit
,因此unsigned int
可以表示的最大值为4294967295
,即0xFFFFFFFF
。这就是为什么你的结果溢出而且32
位中剩余的任何内容都显示为输出。
如果您以十六进制表示5927694924
,则0x16151724C
具有额外的33rd
位1
,将其丢弃,因此输出为0x6151724C
十进制1632727628
。
要在屏幕上打印它,您需要更大的数据类型,如unsigned long long
或uint64_t
或unsigned long
(仅限64位系统),无论您的编译器支持{{1} }位整数。
答案 1 :(得分:2)
4294967295的反向是5927694924,大于4294967295,这是可以存储在32位的最大整数。
答案 2 :(得分:2)
问题是当我输入4294967295时,它会输出1632727628.为什么?
unsigned int
可以存储最多2^32-1
个。 4294967295
的反面是5927694924
,它比2^32-1
大得多。因此,输出为1632727628
。 1632727628
实际上是5927694924 % 4294967296
要解决此问题,您应该使用unsigned long it
。但是,如果这个数字比最高数字长,它又会再次溢出。