我读了一本关于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;
}
特别说明:我使用的是基于intel的电脑,所以int size是32位。
问题:
1。)本书提到这两个代码可以正常运行,虽然其中一个使用%hd
说明符而另一个使用%d
说明符。
2.)本书的原因是因为C机制会自动将类型 short 转换为 int 以便更快地计算,这就是为什么使用{{ 1}}说明符或甚至是%d
,它是32位也会产生正确的结果。
3.)我的问题是,这个转换是什么时候发生的?是在我们作为%ld
函数的参数传递它的时候,就像float变量在传递时转换为double的方式一样作为表达式或参数,或者当我们使用值printf()
??
4.)实际上我做了一个小实验,即使用3
运算符和sizeof
函数打印出变量num的大小,它显示了{{1但我还是不确定转换何时发生。
5.)如果转换发生在我们将值分配给short变量的时间内,那么创建一个短变量的意义是什么?(** 如果不是这样的话,这个问题应该被忽略)
非常感谢您的帮助
答案 0 :(得分:4)
%d
和%hd
在这种情况下是等效的。 printf()
是一个可变函数,因此规则说“整数提升”应用于参数。 printf()
根本看不到short
值,只看到int
。%ld
适用于long int
。这可能比普通int
更大,所以这里的书错了。printf()
的调用中。传递给short int
的任何printf()
都会被编译器转换为int
。 short int
当然没有改变(不知道这意味着什么!)sizeof
打印尺寸时,您打印的数字大小为short int
(且数字类型为size_t
)。 printf()
甚至看不到short int
,sizeof
运算符,并报告了正确的大小。short
变量的重点是,如果您想要short
变量,则创建一个变量。当然,大多数变量都是如此:-)。但如果您认为自己不需要short int
,则可以使用int
。答案 1 :(得分:2)
如果你调用一个没有原型的函数或一个带有可变参数的函数,比如printf(3),那么C会应用一些叫做默认参数的促销。
这些转化促使浮动加倍,小于int
至int
或unsigned int
。这往往会协调大多数类型。
这是一个有趣的功能,可能是C介绍给世界。它实际上在指令集级别或ABI级别发生。参数在寄存器或堆栈中传递,通常没有人允许错位堆栈或将垃圾留在高位中。
另外一个原因是为什么C与硬件如此匹配并且运行得如此之快。
答案 2 :(得分:1)
此转换发生在对printf
的调用中,因为对于可变参数函数,作为...
的一部分传入的所有参数都扩展为int
(或double
,如果参数首先是float
)。