我已经通过自学了C了,我觉得%ld
可以用于更长的号码,我不知道为什么有%d
,而对于更短的一个,%hd
还是类似的?如果有%ld或甚至%lld,为什么我们要使用%d甚至%hd?
我也想知道C说明符是如何工作的,为什么我们需要不同范围的数值数据类型的不同说明符,因为每种数据类型都有限制范围?
我已经通过自学了C了,我觉得%ld
可以用于更长的号码,我不知道为什么有%d
,而对于更短的一个,%hd
还是类似的?如果有%ld或甚至%lld,为什么我们要使用%d甚至%hd?
我也想知道C说明符是如何工作的,为什么我们需要不同范围的数值数据类型的不同说明符,因为每种数据类型都有限制范围?
通过外观你正在谈论打印功能?或者采用类似参数的其他功能。
它与原始类型有关,例如: int
可以保存小于16位的数字。 作为long
可以保存32位。 然后有一个long long
可以保存64位。
这一切都取决于你正在使用的原语,很容易找到原语持有多少位。您还必须小心使用它们的时间和地点,因为用户可能没有足够强大的计算机来运行它。还有一些事实是,某些版本的C可能没有特定的基元,这可能会降低到甚至优化修改后的C系统。
考虑printf(const char *format, ...)
在格式和任意数量的值之后取任意类型。 int
通常占用的空间少于long long
。
printf()
使用format
来确定后面的参数。如果说明符不匹配传递的类型,则为未定义的行为。
long long ll = 12345678;
int i = 4321;
printf("%lld %d\n", ll, i); // Format matches the type and count of arguments passed.
// Result: values printed as text as expected
printf("%d %d %d\n", ll, i); // Format mis-matches the type and count of arguments
// Result: undefined behavior
"%hd"
"%hdd"
涉及另一种机制。 C很早以前决定在使用像short
和signed char
这样的小型号时,在进一步处理(存在一些例外)之前,他们将首先穿过整数促销到int
。因此,对于像printf()
这样的函数,当传递short
时,首先将该值转换为int
。 printf()
不知道它收到的int
最初是int
还是short
。在这种情况下,以下是确定的。
int i = 4321;
short s = 321;
printf("%hd %d\n", i, i); // Format matches the promoted type
printf("%hd %d\n", s, s); // Format matches the promoted type
当printf()
遇到"%hd"
,它希望收到int
,但它会在内部转换是int
值在打印之前short
值。
Google it。你会得到答案。 – MayurK
当你传递一个int时,你可以使用'%d'来打印'int';当你通过一个'long'时使用'%ld',当你通过'long long'时使用'%lld'。你可以使用'%hd'将范围限制为'short'的范围。在打印之前,“int”将被转换为“short”。 –
非常感谢,我现在得到它 –