C 最大无符号整数的反向数
我试着写一个程序来反转用户输入的数字 用户输入范围为0C 最大无符号整数的反向数,c,unsigned-integer,C,Unsigned Integer,我试着写一个程序来反转用户输入的数字 用户输入范围为0
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将其更改为无符号长整型,printf,但仍然输出1632727628。为什么?与
4294967295
相反的是5927694924
,它大于无符号整数的范围
在您的系统中,unsigned int
的宽度为32位
,因此unsigned int
可以表示的最大值为4294967295
,即0xFFFFFFFF
。这就是结果溢出的原因,而32
位中剩余的内容将显示为输出
如果用十六进制表示5927694924
,则为0x16151724C
,它有额外的33位1位,该位被丢弃,因此输出为0x6151724C
,十进制为1632727628
要在屏幕上打印,您需要更大的数据类型,如unsigned long long
或uint64\t
或unsigned long
(仅限64位系统),无论编译器支持什么64
位整数。4294967295的反面是5927694924,大于4294967295,这是可以存储在32位上的最大整数
问题是当我输入4294967295时,它将输出1632727628。为什么?
unsigned int
可以存储2^32-1
最大值。4294967295
的反面是5927694924
,它比2^32-1
大得多。因此,输出是1632727628
16327277628实际上是5927694924%4294967296
要解决此问题,您应该使用无符号长it
。但是,如果数字大于最大长度,它将再次溢出。发生整数溢出。只需将int转换为字符数组,并从头开始打印。但我将其更改为无符号长int,它仍然输出相同的答案。为什么?不,这不仅仅是简单的减法(在这种情况下,结果可能是一样的)。它实际上是模,即5927694924%4294967295
。但我将其更改为无符号长整型,它仍然输出相同的答案。为什么?@MattMcNabb:现在无法编辑我的评论,但我明白你的意思。仅适用于32位系统,但我将其更改为unsigned long int,它仍然输出相同的答案。为什么?@user2301281因为unsigned long
通常与unsigned int
相同,但我将其更改为unsigned long int,它仍然输出相同的答案。为什么?@user2301281因为unsigned long int
也是32位的。您需要更改为无符号长整型,它是64位。不,我更改为无符号长整型,它的输出是547093574220。@user2301281您在任何地方都更改了它吗?我发现了错误,我忘了将数组指定为无符号长整型。对不起,谢谢=D