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,但没有给出任何警告.
为什么我不能在没有警告声明它被隐式转换的情况下这样做 - 当我明确地声明它时?