【问题标题】:How to display the maximum value of a unsigned long long in C?如何在 C 中显示 unsigned long long 的最大值?
【发布时间】:2011-04-23 07:13:36
【问题描述】:

我在这里做错了什么?

$ cat size.c
#include<stdio.h>
#include<math.h>

int main() {

printf ("sizeof unsigned int = %d bytes.\n", sizeof(unsigned int));
printf ("sizeof unsigned long long = %d bytes.\n", sizeof(unsigned long long));

printf ("max unsigned int = %d\n", (int)(pow(2, 32) - 1));
printf ("max unsigned long long = %lld\n", (unsigned long long)(pow(2, 64) - 1));

}
$ gcc size.c -o size
$ ./size
sizeof unsigned int = 4 bytes.
sizeof unsigned long long = 8 bytes.
max unsigned int = 2147483647
max unsigned long long = -1
$ 

我希望 18446744073709551615 作为输出,而不是最后一行的 -1


好的,我完全错过了 232 - 1 的错误值,应该是 4294967295,而不是 2147483647。现在事情变得更有意义了。

【问题讨论】:

    标签: c types long-integer


    【解决方案1】:

    只是不要以为它有一定的价值使用ULLONG_MAX

    【讨论】:

    • #include &lt;limits.h&gt; 获取此宏以及其他宏。比如LLONG_MAXLLONG_MIN
    【解决方案2】:

    使用%llu,而不是%lldd 用于有符号整数,因此 printf 将其显示为有符号 long long。

    【讨论】:

      【解决方案3】:

      编辑:根据 Christoph 的建议将 ~0 更改为 (type) -1。请参阅下面的 cmets。

      您可以通过以下方式获取无符号类型的最大值:

      unsigned long long x = (unsigned long long) -1;
      

      更简单,对吧? =)。其次,您告诉printf() 将给定变量解释为带符号的 long long decimal。试试这个:

      unsigned long long x = (unsigned long long) -1;
      printf("%llu", x);
      

      %llu 表示“long long unsigned”。

      【讨论】:

      • 其实应该是~0LLu
      • 其实 gcc 自己算出来的。
      • @Santiago: gcc 在这里没有任何意义 - 如果没有 llu 后缀,它只会在 ~0 == -1 时按预期工作;强制转换-1 实际上是获得任何无符号类型最大值的首选(和可移植)方法,即x = (unsigned long long)-1;如果您的警告级别足够低,则不需要显式强制转换
      • 选角很丑。只需写-1ULL
      • 强制转换不是必需的,使用-1 是完全有效的。该标准规定 int 将首先扩展到 long long 然后转换为 long long unsigned (这不是标准化的,但总是很高兴转换)。这与将(long long unsigned) -1 放在首位相同。
      【解决方案4】:
      unsigned long long ulTestMax = -1;
      printf ("max unsigned long long = %llu\n", ulTestMax );
      

      这在 C++ 中有效,在这里也应该有效。

      【讨论】:

      • 假设底层架构使用二进制补码
      • 另外,long long 不是标准类型(我记得它是 gnu 扩展)并且不能保证它是 64 位的
      • @Nathan: 将-1 转换为无符号整数类型可以保证 C 标准(特别是 C99 6.3.1.3 §2)产生最大值
      • @Nathan:你错了。这与二进制补码无关,只是无符号值的严格定义行为。
      【解决方案5】:

      谁对 Kiril Kirov 做了 -1 的帖子,请看这里:

      Is it safe to use -1 to set all bits to true? 野狗发帖

      在 Kiril 帖子中,仅需要对符号扩展进行轻微修改:

      unsigned long long ulTestMax = -1LLu; 
      

      -1 是反模式,如果您不想使用 lmits.h 提供的解决方案,它会完成这项工作

      【讨论】:

        猜你喜欢
        • 2013-08-20
        • 1970-01-01
        • 1970-01-01
        • 2016-07-29
        • 1970-01-01
        • 2011-08-06
        • 1970-01-01
        • 1970-01-01
        • 2015-08-22
        相关资源
        最近更新 更多