C标准规定long int
至少为4个字节,在我的系统上是8个字节。
这意味着我可以在long
中存储值高达2^63-1,在unsigned long
中存储值高达2^64-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
- Christian Gibbonsul
。 - Ctx