【问题标题】:How can I print maximum value of an unsigned integer?如何打印无符号整数的最大值?
【发布时间】:2012-10-10 05:55:13
【问题描述】:

我想打印 4 个字节的无符号整数的最大值。

#include "stdafx.h"
#include "conio.h"

int _tmain(int argc, _TCHAR* argv[])
{
    unsigned int x = 0xffffffff;
    printf("%d\n",x);
    x=~x;
    printf("%d",x);
    getch();
    return 0;
}

但我得到的输出是 -1 和 0。我怎样才能打印 x = 4294967295?

【问题讨论】:

  • 使用库limits.h(我不确定,但它可能是一个c++库)

标签: c


【解决方案1】:

%d 格式将其参数视为 已签名 int。请改用%u

但获得unsigned int 类型最大值的更好方法是使用UINT_MAX 宏。你需要

#include <limits.h>

使其可见。

您还可以通过将值 -1 转换为类型来计算无符号类型的最大值。

#include <limits.h>
#include <stdio.h>
int main(void) {
    unsigned int max = -1;
    printf("UINT_MAX = %u = 0x%x\n", UINT_MAX, UINT_MAX);
    printf("max      = %u = 0x%x\n", max, max);
    return 0;
}

请注意,UINT_MAX 并非必要 0xffffffff。如果unsigned int 恰好是 32 位,但它可能小到 16 位;在一些系统上它是 64 位。

【讨论】:

    【解决方案2】:

    使用%u 作为 printf 格式字符串。

    【讨论】:

      【解决方案3】:

      代码如下:

      #include <stdio.h>
      
      int main(void) {
          unsigned int a = 0;
          printf("%u", --a);
          return 0;
      }
      

      输出:

      4294967295

      它的工作原理是0unsigned int 的最小值,当您将该值进一步减小1 时,它会环绕并移动到最大值。

      【讨论】:

        【解决方案4】:

        &lt;limits.h&gt;中定义了宏:UINT_MAX

        【讨论】:

          【解决方案5】:

          使用 %u 作为格式字符串来打印unsigned int%lu 用于unsigned long%hu 用于unsigned short

          【讨论】:

            【解决方案6】:

            您应该使用&lt;stdint.h&gt;&lt;limits.h&gt; 然后INT_MAX 或任何适合您类型的限制。

            【讨论】:

              【解决方案7】:

              printf("%u", ~0); //用 1 填充 unsigned int 中的所有位并打印值。

              【讨论】:

              • 这是未定义的行为,%u 用于 unsigned int,但 ~0signed int
              • @M.M.简单的强制就可以了:printf("==&gt; Converted signed to unsigned int: %u\n", (unsigned int)~0);
              • @JonathanKomar 在一个补码或符号幅度系统上不会产生最大的无符号整数。应该是~0u
              【解决方案8】:

              做到这一点的好奇和简单的方法就是

              printf("%lu",-1);
              

              它会打印您计算机中最大的未签名内容:)

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-05-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-04-01
                • 2023-04-02
                • 2015-02-20
                相关资源
                最近更新 更多