C数据类型:在Short和Int之间
我读了一本关于C语言的书,最好先介绍代码,然后在后面提问 第一代码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
#包括
内部主(空)
{
短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;
}