【发布时间】:2017-11-09 16:02:06
【问题描述】:
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 不会发出此警告。然后我的老师建议我可以使用limits.h中定义的ULONG_MAX,这没有给出任何警告。
为什么我不能在没有警告说它被隐式转换的情况下执行此操作 - 当我显式声明它时?
【问题讨论】:
-
您需要将文字指定为无符号长整数。
18446744073709551615UL -
尝试在你的数字常量后添加
ul