C数据类型:在Short和Int之间

| 我读了一本关于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的PC,因此int大小为32位。 题 : 1.)书中提到这两个代码可以正确运行,尽管其中一个使用
%hd
说明符,而另一个使用
%d
说明符。 2.)书中的原因是因为C机制会自动将short类型转换为int以便更快地进行计算,这就是为什么使用32位的
%d
甚至
%ld
也会产生正确的结果的原因。 3.)我的问题是,什么时候发生这种转换?是在我们将其作为参数传递给
printf()
函数的时间,就像将float变量作为表达式或参数传递时如何将其转换为double一样,或者在我们将变量初始化为值
3
?? 4,实际上我已经做了一个小实验,那就是使用
sizeof
运算符和
printf()
函数打印出变量num的大小,并显示
2 bytes
,但是我仍然不确定转换何时发生。 5.)如果转换是在我们将值分配给short变量的时间内发生的,那么创建short变量的意义何在?(**如果不是这种情况,则应忽略此问题) 非常感谢您的帮助     
已邀请:
如果调用没有原型的函数或带有可变参数的函数(如printf(3)),则C应用称为默认参数提升的东西。 这些转换使float翻倍,并且凡是小于
int
int
unsigned int
的东西。这往往会协调大多数类型。 这可能是C引入世界的一个有趣功能。实际上,它在某种程度上发生在指令集级别或ABI级别。参数在寄存器中或在堆栈上传递,通常没有人允许未对齐堆栈或在高阶位留下垃圾。 C如此出色地匹配硬件并运行得如此之快的另一个原因。     
是的,在这种情况下,ѭ3和ѭ2是等效的。
printf()
是可变函数,因此规则说“整数提升”应用于自变量。
printf()
根本看不到
short
的值,而只看到see11ѭ。
%ld
代表
long int
。它的大小可能会比普通的ѭ11大,因此这本书是错误的。 转换发生在对
printf()
的调用中。传递给
printf()
的任何
short int
都会由编译器转换为
int
short int
当然不会改变(不确定那是什么意思!) 当使用ѭ8the打印尺寸时,您正在打印的数字是
short int
的尺寸(且数字为
size_t
类型)。
printf()
甚至看不到
short int
sizeof
运算符却显示正确的大小。 创建
short
变量的要点是,如果需要
short
变量,则可以创建一个。当然,对于大多数变量来说都是这样。但是,如果您认为不需要ѭ24,,也可以只使用
int
。     
这种转换发生在对
printf
的调用中,因为对于可变参数函数,作为
...
的一部分传入的所有参数都首先扩展为
int
(如果参数是
float
,则扩大为
double
)。     

要回复问题请先登录注册