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

C数据类型:在Short和Int之间,c,types,int,short,C,Types,Int,Short,我读了一本关于C语言的书,最好先介绍代码,然后在后面提问 第一代码 #包括 内部主(空) { 短num=3; printf(“%hd\n”,num); 返回0; } 第二代码 #包括 内部主(空) { 短num=3; printf(“%d\n”,num); 返回0; } 特别注意:我使用的是基于intel的pc,因此int大小为32位 问题: 1.)本书提到这两个代码可以正确运行,尽管其中一个使用%hd说明符,而另一个使用%d说明符 2.)这本书的原因是,由于C机制会自动将类型short

我读了一本关于C语言的书,最好先介绍代码,然后在后面提问

第一代码
#包括
内部主(空)
{
短num=3;
printf(“%hd\n”,num);
返回0;
} 

第二代码
#包括
内部主(空)
{
短num=3;
printf(“%d\n”,num);
返回0;
}
特别注意:我使用的是基于intel的pc,因此int大小为32位

问题:

1.)本书提到这两个代码可以正确运行,尽管其中一个使用
%hd
说明符,而另一个使用
%d
说明符

2.)这本书的原因是,由于C机制会自动将类型short转换为int以加快计算速度,这就是为什么使用
%d
说明符,甚至是32位的
%ld
也会产生正确的结果

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

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

5.)如果转换发生在我们将值分配给短变量的时间内,那么创建短变量有什么意义??(*如果不是这样,这个问题应该忽略)


非常感谢您的帮助

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

  • 是的,
    %d
    %hd
    在这种情况下是等效的
    printf()
    是一个可变函数,因此规则规定“整数提升”应用于参数
    printf()
    根本看不到
    short
    值,它只看到
    int
  • %ld
    表示
    长整数。这本书的尺寸可能比普通的
    int
    大,所以这本书是错的
  • 转换发生在对
    printf()
    的调用中。任何传递到
    printf()
    short int
    都会被编译器转换为
    int
    。当然,
    short int
    不会更改(不确定这到底是什么意思!)
  • 当您使用
    sizeof
    打印大小时,您正在打印一个与
    short int
    大小相同的数字(该数字的类型为
    size\u t
    printf()
    甚至看不到
    short int
    sizeof
    操作符看到,并报告正确的大小
  • 创建
    short
    变量的意义在于,如果需要
    short
    变量,可以创建一个。当然,大多数变量都是如此:-)。但是如果你不认为你需要一个
    短整数
    ,那就直接使用
    int

  • 如果你调用一个没有原型的函数或者一个带有变量参数的函数,比如printf(3),那么C会应用一个叫做默认参数的东西

    这些转换将浮点值提升为双精度,并将小于
    int
    的任何值提升为
    int
    无符号int
    。这有助于协调大多数类型

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

    C与硬件的匹配如此之好,运行如此之快,还有一个原因。

    “基于英特尔的pc”与整数大小无关。在旧的16位x86上,int将是16位,而在x86_64中,某些编译器实现将int设置为64位。英特尔安腾也有64位整数
    #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;
    
    }