2016-12-22 271 views
-4

我已经通过自学了C了,我觉得%ld可以用于更长的号码,我不知道为什么有%d,而对于更短的一个,%hd还是类似的?如果有%ld或甚至%lld,为什么我们要使用%d甚至%hd?

我也想知道C说明符是如何工作的,为什么我们需要不同范围的数值数据类型的不同说明符,因为每种数据类型都有限制范围?

+0

Google it。你会得到答案。 – MayurK

+1

当你传递一个int时,你可以使用'%d'来打印'int';当你通过一个'long'时使用'%ld',当你通过'long long'时使用'%lld'。你可以使用'%hd'将范围限制为'short'的范围。在打印之前,“int”将被转换为“short”。 –

+0

非常感谢,我现在得到它 –

回答

0

通过外观你正在谈论打印功能?或者采用类似参数的其他功能。

它与原始类型有关,例如: int可以保存小于16位的数字。 作为long可以保存32位。 然后有一个long long可以保存64位。

这一切都取决于你正在使用的原语,很容易找到原语持有多少位。您还必须小心使用它们的时间和地点,因为用户可能没有足够强大的计算机来运行它。还有一些事实是,某些版本的C可能没有特定的基元,这可能会降低到甚至优化修改后的C系统。

0

考虑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很早以前决定在使用像shortsigned char这样的小型号时,在进一步处理(存在一些例外)之前,他们将首先穿过整数促销int。因此,对于像printf()这样的函数,当传递short时,首先将该值转换为intprintf()不知道它收到的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值。