【发布时间】:2019-07-15 18:34:00
【问题描述】:
我正在完成“Learn C the hard way”一书中的练习。练习 7 要求读者找出使unsigned long 的范围超出的值。
将
long更改为unsigned long并尝试找出使其过大的数字。
所以我的方法是首先在我的机器上获取unsigned long 的大小:
printf("SIZEOF ULONG: %lu", sizeof(unsigned long));
这会打印出8。因此,假设 unsigned long 在我的机器上占用 64 位,我在 Wikipedia 上查找了最大范围。
64 位(word、doubleword、longword、long long、quad、quadword、qword、int64)
- 无符号:从 0 到 18,446,744,073,709,551,615
我原以为使用上述值声明 unsigned long 会在没有警告的情况下编译,直到我将该值增加 1。但结果不同。编译以下程序会导致警告。
#include <stdio.h>
int main()
{
unsigned long value = 18446744073709551615;
printf("SIZEOF ULONG: %lu", sizeof(unsigned long));
printf("VALUE: %lu", value);
return 0;
}
bla.c: In function ‘main’:
bla.c:5:27: warning: integer constant is so large that it is unsigned
unsigned long value = 18446744073709551615;
^~~~~~~~~~~~~~~~~~~~
那么为什么 gcc 抱怨值太大,我以为我已经将它声明为unsigned?
【问题讨论】:
-
你声明了变量的类型,但没有声明值。
-
#include <limits.h>并使用ULONG_MAX。 -
旁白:你应该使用
%zu格式说明符来表示类型size_t而不是%lu。
标签: c long-integer unsigned