[英]C datatype : Between Short and 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;
}
: I'm using intel based pc so int size is 32-bit. :我使用的是基于Intel的PC,因此int大小为32位。
题 :
1.)书中提到这两个代码可以正确运行,尽管其中一个使用%hd
说明符,而另一个使用%d
说明符。
to for faster computation,that is why by using the %d
specifier or even %ld
which is 32-bit would yield the correct result too. 2)书中的原因是因为C机制会自动将类型转换为以进行更快的计算,因此为什么使用%d
说明符甚至32位的%ld
也会产生正确的结果。
3)我的问题是,什么时候发生这种转换?是在我们将其作为参数传递给printf()
函数的时间里吗,就像将float变量作为表达式或表达式传递给double时如何将其转换为double一样。参数,或者在我们初始化变量时使用值3
?
4)实际上我已经做了一个小实验,即使用sizeof
运算符和printf()
函数打印出变量num的sizeof
,它显示了2 bytes
但我仍然不确定何时进行转换。
) 5)如果转换是在我们将值分配给short变量的时间内发生的,那么创建short变量的意义何在?(** )
非常感谢您的帮助
%d
和%hd
是等效的。 printf()
是一个可变函数,因此规则说“整数提升”应用于参数。 printf()
根本看不到short
值,而只看到int
。 %ld
用于long int
。 它的大小可能比普通int
,所以这本书是错误的。 printf()
的调用中。 传递给printf()
任何short int
由编译器转换为int
。 short int
当然是不会改变的(无论如何也不知道这是什么意思!) sizeof
打印大小时,您正在打印的数字是short int
的大小(该数字的大小为size_t
)。 printf()
甚至看不到short int
, sizeof
运算符没有,并且报告了正确的大小。 short
变量的关键是,如果需要short
变量,则可以创建一个。 当然,对于大多数变量来说都是这样。 但是,如果您认为不需要专门的short int
,则可以只使用int
。 如果您调用没有原型的函数或带有可变参数的函数(例如printf(3)),那么C会应用称为默认参数提升的东西。
这些转换将float提升为double,并将小于int
任何值提升为int
或unsigned int
。 这往往会协调大多数类型。
这可能是C引入世界的一个有趣功能。 实际上,它在某种程度上发生在指令集级别或ABI级别。 参数在寄存器中或在堆栈上传递,通常没有人允许未对齐堆栈或在高阶位留下垃圾。
C如此出色地匹配硬件并运行得如此之快的另一个原因。
这种转换发生在调用printf
,因为可变参数的功能,所有参数传递进来的一部分...
得到扩大至int
(或double
,如果该参数是一个float
)第一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.