欢迎光临
我们一直在努力

各种数据类型的长度

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 <stdio.h>
int main()
{
printf("&zu\\n",sizeof(char));
printf("&zu\\n",sizeof(_Bool));
printf("&zu\\n",sizeof(short));
printf("&zu\\n",sizeof(int));
printf("&zu\\n",sizeof(long));
printf("&zu\\n",sizeof(long long));
printf("&zu\\n",sizeof(float));
printf("&zu\\n",sizeof(double));
printf("&zu\\n",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。

赞(0)
未经允许不得转载:171主机测评 » 各种数据类型的长度
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址