2

我读了一本关于 C 的书,我最好先呈现代码并在后者中提问。

第一个密码

#include <stdio.h>

int main(void)
{
short num = 3;

printf("%hd\n" , num );

return 0;

} 


第二代码

#include <stdio.h>

int main(void)
{
short num = 3;

printf("%d\n" , num );

return 0;

}

特别说明:我使用的是基于英特尔的电脑,所以 int 大小是 32 位的。

问题 :

1.)书中提到这两个代码可以正确运行,尽管其中一个使用说明%hd符而另一个使用%d说明符。

2.)书中的原因是因为C机制会自动将类型转换int加快计算速度,这就是为什么使用说明%d符甚至%ld是32位也会产生正确的结果。

3.)我的问题是,这种转换是什么时候发生的?是在我们将它作为参数传递给printf()函数的时候吗,就像浮点变量作为表达式或参数传递时如何转换为双精度一样,或者当我们用一个值初始化变量时3

4.)实际上我做了一个小实验,即使用sizeof运算符和printf()函数打印出变量 num 的大小,它显示给我2 bytes。但我仍然不确定转换何时发生。

5.)如果转换发生在我们为short变量赋值的时候,那么创建一个short变量有什么意义??(**如果不是这种情况,这个问题应该忽略

非常感谢您的帮助

4

3 回答 3

4
  1. 是的%d%hd在这种情况下是等价的。 printf()是一个可变参数函数,所以规则说“整数提升”应用于参数。 printf()根本看不到short值,它只看到一个int.
  2. %ld是为long int。这可能比普通的大int,所以这本书是错误的。
  3. 转换发生在对 的调用中printf()。任何short int传递给的都由编译器printf()转换为。int当然没有改变(不知道那short int是什么意思!)
  4. 当您使用 打印大小时sizeof,您正在打印一个大小为 的short int数字(并且该数字是 类型size_t)。 printf()甚至看不到short int,sizeof运算符,并报告正确的大小。
  5. 创建short变量的意义在于,如果你想要一个short变量,你就创建一个。当然,大多数变量都是如此:-)。但是,如果您认为不需要short int特别使用int.
于 2011-04-24T18:29:01.600 回答
2

如果你调用一个没有原型的函数一个带有可变参数的函数,比如 printf(3),那么 C 会应用一些称为默认参数提升的东西。

这些转换将 float 提升为 double 以及任何小于inttoint或的东西unsigned int。这倾向于协调大多数类型。

这是一个有趣的特性,可能是 C 引入世界的。它实际上在某种程度上发生在指令集级别或 ABI 级别。参数在寄存器或堆栈中传递,通常没有人允许未对齐堆栈或将垃圾留在高阶位中。

这只是 C 与硬件匹配得如此之好且运行得如此之快的另一个原因。

于 2011-04-24T18:29:52.570 回答
1

这种转换发生在对 的调用中printf,因为对于可变参数函数,作为...get 的一部分传入的所有参数首先扩展为int(或者double,如果参数是 a float)。

于 2011-04-24T18:15:41.670 回答