【发布时间】:2015-12-04 18:39:45
【问题描述】:
我声明了一个 long long 类型的变量并分配给它LLONG_MIN,但我不允许这样做。
ft_long_long_to_ascii_base.c:23:14: 错误:整数常量太大以至于它是无符号的[-Werror]
if (val == -9223372036854775808)
【问题讨论】:
我声明了一个 long long 类型的变量并分配给它LLONG_MIN,但我不允许这样做。
ft_long_long_to_ascii_base.c:23:14: 错误:整数常量太大以至于它是无符号的[-Werror]
if (val == -9223372036854775808)
【问题讨论】:
与其猜测LLONG_MIN 可能是什么,不如使用提供的宏
#include <stdint.h>
if (val == LLONG_MIN)
【讨论】:
默认情况下,整数常量的类型为 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));
int”。更改发生在 C99 中(不要认为 C89 有 long long)。因此,使用(-9223372036854775807L - 1) 具有一些 的向后可比性价值。当然long long 可能 比 64 位更宽,所以这个值是错误的。鉴于这些复杂性 - 最容易使用 LLONG_MIN