繁体   English   中英

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

[英]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变量的意义何在?(**

非常感谢您的帮助

  1. 是的,在这种情况下, %d%hd是等效的。 printf()是一个可变函数,因此规则说“整数提升”应用于参数。 printf()根本看不到short值,而只看到int
  2. %ld用于long int 它的大小可能比普通int ,所以这本书是错误的。
  3. 转换发生在对printf()的调用中。 传递给printf()任何short int由编译器转换为int short int当然是不会改变的(无论如何也不知道这是什么意思!)
  4. 当您使用sizeof打印大小时,您正在打印的数字是short int的大小(该数字的大小为size_t )。 printf()甚至看不到short intsizeof运算符没有,并且报告了正确的大小。
  5. 创建short变量的关键是,如果需要short变量,则可以创建一个。 当然,对于大多数变量来说都是这样。 但是,如果您认为不需要专门的short int ,则可以只使用int

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

这些转换将float提升为double,并将小于int任何值提升为intunsigned int 这往往会协调大多数类型。

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

C如此出色地匹配硬件并运行得如此之快的另一个原因。

这种转换发生在调用printf ,因为可变参数的功能,所有参数传递进来的一部分...得到扩大至int (或double ,如果该参数是一个float )第一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM