各种数据类型的长度
1.sizeof操作符
sizeof是一个关键字,专门用来计算sizeof的操作数的类型长度的,存储的数据范围就有所差异。
sizeof操作符的操作数可以是类型,也可是变量或者表达式。
sizeof(类型)
sizeof 表达式
注意:sizeof的操作数如果不是类型,是表达式的时候,可以省略后边的括号(如上图所示)!
sizeof 运算符的返回值,C语⾔只规定是无符号整数,并没有规定具体的类型,而是留给系统自己去决定, sizeof 到底返回什么类型。不同的系统中,返回值的类型有可能是unsigned int ,也有可能是 unsigned long ,甚⾄是 unsigned long long , 对应的 printf() 占位符分别是 %u 、 %lu 和 %llu 。这样不利于程序的可移植性。
因此,C语言提供了⼀个解决方法,创造了⼀个类型别名 size_t ,用来统⼀表示sizeof 的返回值类型。
对应当前系统的 sizeof 的返回值类型,可能是 unsigned int ,也可能是 unsigned long long 。
2.数据类型长度
//sizeof计算的结果是size_t类型的,size_t类型的数据打印使用%zu
#include
int main()
{
printf("&zu
",sizeof(char));
printf("&zu
",sizeof(_Bool));
printf("&zu
",sizeof(short));
printf("&zu
",sizeof(int));
printf("&zu
",sizeof(long));
printf("&zu
",sizeof(long long));
printf("&zu
",sizeof(float));
printf("&zu
",sizeof(double));
printf("&zu
",sizeof(long double));
return 0;
}
所计算出的结果分别是:1,1,2,4,4,8,4,8,8,单位为字节。
那么这时候便可能会有一个疑问,字节到底是什么呢?
首先,假设我们在计算机中想要存储一个二进制位,当然,我们知道计算机能理解的是二进制,二进制中经常有1或者是0,那么想把1存储起来需要一块空间,同理,想把0存储起来也需要一块空间,那么存1或者0的这样一个空间的大小就叫做:1bit位,(一个bit位就可以存一个二进制位),那么8个bit位放在一起,这样的一个空间就叫做一个字节,也是char和bool的长度。
那么此时又有一个问题,long是长整型,为什么字节数与int(整形)的字节数相同呢?
在c语言标准中规定,sizeof(long)>=sizeof(int),但long的长度没有具体的规定,有时候是4,有时候是8,在不同的环境中字节数不一定相同。同时,sizeof(long double)>=sizeof(double)。

3.sizeof中表达式不计算
举一个例子,

此时,最关键的一个点是sizeof中的表达式是不计算的。
那么此时我们可以假设s被赋值,如果赋值成功,那么s就变成了7,但是当我们打印s的时候,会发现s的值还是10,所以5+2=7赋值给s这个表达式并没有计算,所以可以得出sizeof里面放的表达式是不会真实计算的。
如果是这样,那么可能会想问既然不会真实计算,那么sizeof如何计算长度呢?
其实,是通过类型来推导的。
那么是怎么推导出2的呢?
a是int类型的,且2也是int类型的,如果要计算的话,那就是两个int相加的结果也是int类型的,而现在要把算出的结果赋给s,且s是short类型的,现在我们要将int的结果放入s中,所以这个表达式的结果是s说了算,而最终的结果是取决于s的类型,且s是short类型,所以求出长度是2。









