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

时间:2011-04-24 18:12:28

标签: c types int short

我读了一本关于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变量的时间内,那么创建一个短变量的意义是什么?(** 如果不是这样的话,这个问题应该被忽略

非常感谢您的帮助

3 个答案:

答案 0 :(得分:4)

  1. 是的,%d%hd在这种情况下是等效的。 printf()是一个可变函数,因此规则说“整数提升”应用于参数。 printf()根本看不到short值,只看到int
  2. %ld适用于long int。这可能比普通int更大,所以这里的书错了。
  3. 转化发生在对printf()的调用中。传递给short int的任何printf()都会被编译器转换为intshort int当然没有改变(不知道这意味着什么!)
  4. 使用sizeof打印尺寸时,您打印的数字大小为short int(且数字类型为size_t)。 printf()甚至看不到short intsizeof运算符,并报告了正确的大小。
  5. 创建short变量的重点是,如果您想要short变量,则创建一个变量。当然,大多数变量都是如此:-)。但如果您认为自己不需要short int,则可以使用int

答案 1 :(得分:2)

如果你调用一个没有原型的函数一个带有可变参数的函数,比如printf(3),那么C会应用一些叫做默认参数的促销

这些转化促使浮动加倍,小于intintunsigned int。这往往会协调大多数类型。

这是一个有趣的功能,可能是C介绍给世界。它实际上在指令集级别或ABI级别发生。参数在寄存器或堆栈中传递,通常没有人允许错位堆栈或将垃圾留在高位中。

另外一个原因是为什么C与硬件如此匹配并且运行得如此之快。

答案 2 :(得分:1)

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