【问题标题】:If there is %ld or or even %lld, why do we use %d or even %hd?如果有 %ld 甚至 %lld,我们为什么要使用 %d 甚至 %hd?
【发布时间】:2017-05-07 16:03:07
【问题描述】:

我是自学C的,我想既然%ld可以用于更长的数字,我不知道为什么会有%d,而对于更短的,%hd之类的?

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

【问题讨论】:

  • 谷歌它。你会得到答案。
  • 当您传递一个int 时,您使用%d 打印一个int;当您通过long 时使用%ld,当您通过long long 时使用%lld。您可以使用%hd 将范围限制为short 的范围; int 将在打印之前转换为 short。
  • 非常感谢,我知道了
  • 您问的是printf() 还是scanf()?请不要同时说这两个,因为这会使这个广泛的问题更加广泛。
  • 我不知道每个说明符对不同功能的作用不同,我想谈谈'printf()'。

标签: c types


【解决方案1】:

考虑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 值。

【讨论】:

    【解决方案2】:

    从表面上看,您是在谈论打印功能吗?或者其他一些采用类似参数的函数。

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

    这完全取决于您使用的原语,很容易找到一个原语包含多少位。您还必须小心使用它们的时间和地点,因为用户可能没有足够强大的计算机来运行它。还有一个事实是,某些版本的 C 可能没有特定的原语,这可能归结为老化甚至是修改后的 C 系统的优化。

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 1970-01-01
      • 2021-11-30
      • 2019-08-10
      • 2021-06-27
      • 2016-09-24
      • 1970-01-01
      相关资源
      最近更新 更多