【问题标题】:reverse number for max unsigned int最大无符号整数的反向数字
【发布时间】:2014-04-25 07:56:27
【问题描述】:

我尝试编写一个程序来反转用户输入的数字。

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

【问题讨论】:

  • 发生整数溢出
  • 只需将 int 转换为 char 数组并从头到尾打印。
  • 但我将其更改为 unsigned long int,它仍然输出相同的答案。为什么?

标签: c unsigned-integer


【解决方案1】:

4294967295的反面是5927694924,大于unsigned int的范围

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

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

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

【讨论】:

  • 不,这不仅仅是简单的减法(但是在这种情况下,结果可能相同)。它实际上是模数,即5927694924 % 4294967295.
  • 但我将其更改为 unsigned long int,它仍然输出相同的答案。为什么?
  • @MattMcNabb:现在无法编辑我的评论,但我明白你的意思。
【解决方案2】:

4294967295的倒数是5927694924,大于4294967295,4294967295是32位可以存储的最大整数。

【讨论】:

  • 但我将其更改为 unsigned long int,它仍然输出相同的答案。为什么?
  • @user2301281 因为unsigned long int 也是 32 位的。需要改成unsigned long long int,是64位的。
  • 不,我改成 unsigned long long int 输出 547093574220。
  • @user2301281 你到处改了吗?
  • 我发现了错误,我忘记将数组分配为 unsigned long long int。对不起,谢谢。 =D
【解决方案3】:

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

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

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

【讨论】:

  • 仅适用于 32 位系统
  • 但我将其更改为 unsigned long int,它仍然输出相同的答案。为什么?
  • @user2301281 因为unsigned long 通常和unsigned int 是一回事
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
相关资源
最近更新 更多