gpt4 book ai didi

c - 为什么 GCC 在将 unsigned long 设置为 2^64-1 时会发出警告?

转载 作者:太空狗 更新时间:2023-10-29 15:48:25 25 4
gpt4 key购买 nike

C 标准声明 long int至少是 4 个字节 - 在我的系统上是 8 个字节。

这意味着我可以在 long 中存储最多 2^63-1 的值|和 unsigned long 中的 264-1 .

但是,当使用 -Wall 编译以下代码时标记它发出警告 [Wimplicitly-unsigned-literal] :

int main (int argc, char ** argv) {

unsigned long a;
a = 18446744073709551615; // 2^64-1

}

如果我改用 263-1 (9223372036854775807),它会在没有警告的情况下编译(正如预期的那样 - 263-1 将适合 signed long int ) .

对于一个项目,我需要在 unsigned long 中获得最大值,我发现 (9223372036854775807 << 1) + 1不会引发此警告。然后我的老师建议我可以使用 ULONG_MAXlimits.h 中定义这没有给出任何警告。

为什么我不能在没有警告的情况下执行此操作,说明它是隐式转换的 - 当我明确声明它时?

最佳答案

根据 C 标准,不带后缀的十进制常量的类型是 intlong intlong long int,具体来说第一个足以代表值(value)的。在您的 C 实现中,这些都不能表示 18446744073709551615,因为它太大了。

为了适应您,编译器将其类型设为 unsigned long。从技术上讲,这不符合 C 标准,因此编译器会警告您。

在这种情况下,不会造成任何伤害,因为您正在将值分配给 unsigned long。但在某些情况下,使用错误的类型会导致问题,因此通常您应该为此类常量附加一个后缀,以确保它们与预期的使用方式相匹配。在这种情况下,u 就足够了;对于无后缀类型,编译器将根据大小决定是使用 unsigned intunsigned long int 还是 unsigned long long int类型的数量和功能。

关于c - 为什么 GCC 在将 unsigned long 设置为 2^64-1 时会发出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47206369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com