相关疑难解决方法(0)

为什么GCC在将无符号长度设置为2 ^ 64-1时会发出警告?

C标准规定a long int至少为4个字节 - 在我的系统上它是8个字节.

这意味着我可以在a中存储最多2 ^ 63 -1的值,在a中存储long2 64 -1 unsigned long.

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

如果我使用2 63 -1(9223372036854775807)代替它,它编译没有警告(正如预期的那样 - 2 63 -1将适合a signed long int).

对于一个项目,我需要具有最大值unsigned long,并且我发现(9223372036854775807 << 1) + 1不会引发此警告.然后我的老师建议我可以使用已ULONG_MAX定义的内容limits.h,但没有给出任何警告.

为什么我不能在没有警告声明它被隐式转换的情况下这样做 - 当我明确地声明它时?

c gcc

3
推荐指数
2
解决办法
675
查看次数

标签 统计

c ×1

gcc ×1