【问题标题】:How to print LLONG_MIN without printf in C? [duplicate]如何在 C 中不使用 printf 打印 LLONG_MIN? [复制]
【发布时间】:2015-12-04 18:39:45
【问题描述】:

我声明了一个 long long 类型的变量并分配给它LLONG_MIN,但我不允许这样做。

ft_long_long_to_ascii_base.c:23:14: 错误:整数常量太大以至于它是无符号的[-Werror]

if (val == -9223372036854775808)

【问题讨论】:

    标签: c printing


    【解决方案1】:

    与其猜测LLONG_MIN 可能是什么,不如使用提供的宏

    #include <stdint.h>
    if (val == LLONG_MIN)
    

    【讨论】:

      【解决方案2】:

      默认情况下,整数常量的类型为 int,但正如警告所示,9223372036854775808 不适合 int- 不是常量的一部分,它是一元运算符(因此,没有负整数常量)。要创建long long int 类型的整数常量,请在您的整数常量后面加上LL

      出现警告是因为 9223372036854775808 太大而无法放入 long long 中,这是无后缀十进制整数常量可以假设的最大类型(参见 ISO 9899:2011 §6.4.4.1 ¶5)。 - 实际上不是常量的一部分,它是应用于正整数常量的一元运算符。

      提及LLONG_MIN 的值因此很棘手,第二好的方法(除了在limits.h 中使用常量)是这样做:

      -9223372036854775807 - 1
      

      【讨论】:

      • 它有效,谢谢。
      • 或者只使用LLONG_MIN 宏,避免繁琐。
      • “默认情况下,整数常量的类型为int”并非如此。类型取决于其值和平台以及后缀 - 请参阅 C11 §6.4.4.1 5 尝试printf("%zu %zu\n", sizeof (int), sizeof (9223372036854775807));
      • @chux 嗯,这很有趣。那部分是新的吗?让我修正一下我的答案。
      • C89 确实说“整数字符常量的类型为 int”。更改发生在 C99 中(不要认为 C89 有 long long)。因此,使用(-9223372036854775807L - 1) 具有一些 的向后可比性价值。当然long long 可能 比 64 位更宽,所以这个值是错误的。鉴于这些复杂性 - 最容易使用 LLONG_MIN
      猜你喜欢
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多