【问题标题】:C datatype : Between Short and IntC 数据类型:介于 Short 和 Int 之间
【发布时间】:2011-08-11 22:52:33
【问题描述】:

我看过一本讲 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 以加快计算速度,这就是为什么使用@987654325 @ 说明符甚至是 32 位的 %ld 也会产生正确的结果。

3.)我的问题是,这种转换是什么时候发生的?是在我们将它作为参数传递给 printf() 函数的时候吗,就像 float 变量在作为参数传递时如何转换为 double 一样表达式或参数,或者在我们使用值 3?? 初始化变量时?

4.)实际上我做了一个小实验,即使用sizeof 运算符和printf() 函数打印出变量num 的大小,它显示了2 bytes。但我仍然不确定何时发生转换。

5.)如果转换发生在我们为short变量赋值的时候,那么创建一个short变量有什么意义??(**如果不是这种情况,这个问题应该忽略 i>)

非常感谢您的帮助

【问题讨论】:

  • "intel based pc" 与 int 大小无关。在旧的 16 位 x86 上,int 为 16 位,而在 x86_64 中,某些编译器实现将 int 为 64 位。 Intel Itanium 也有 64 位 int

标签: c types int short


【解决方案1】:

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

【讨论】:

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

    【讨论】:

      【解决方案3】:

      如果你调用一个没有原型的函数一个带有可变参数的函数,比如 printf(3),那么 C 会应用一种叫做 默认参数提升的东西。 p>

      这些转换将浮点数提升为双精度值,并将小于 int 的任何值提升为 intunsigned int。这往往会协调大多数类型。

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

      C 语言与硬件的匹配度如此之高且运行速度如此之快的另一个原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-22
        • 2020-04-08
        • 1970-01-01
        • 2017-07-30
        • 2010-10-28
        • 2013-10-16
        • 2012-04-26
        • 1970-01-01
        相关资源
        最近更新 更多