在c语言中数据分为内置数据和自定义数据2种;
内值数据类型分为字符型(char),整型(int),浮点数型(float),还有布尔类型(_Bool);
字符型
char
signed char
unsigned char
整型
//短整型
short
signed short
unsigned short
//整型
int
signed int
unsigned int
//长整型
long
signed long
unsigned long
//更长的整型
long long
signed long long
unsigned long long
浮点数类型
//单精度浮点数
float
//双精度浮点数
double
//精度更高的浮点数
long double
这里的signed和unsigned表示的是有符号和无符号的整型;
signed里面是可以包含零和正负数的,而unsigned只能包括0和正数;
而这也代表数据所能包含的内存最大值有所不同;
每个数据的所能存储的数据类型长度也是不同的,接下来我们来看一组代码:
这里我们用到了一个关键字sizeof,sizeof是用来专门计算操作数类型的长度的,它的单位是字节(byte)。(sizeof的返回值类型是无符号类型,c语言给它规定为size_t类型,返回值用%zd表示,也可用%u)。
计算机中的单位有bit,byte,kb,mb,gb,tb,pb,换算单位如下:
我们可以看到每个数据类型所能够存储的长度是不一样的,其中c语言规定long int >=int即可;
如果我们在sizeof的后面放上一个表达式呢?
前面我们提到了sizeof是一个用来计算操作数的类型长度的,我们给变量i赋予了一个类型为int,
那么实际上这里计算的应该是变量的数据类型长度。当我们计算表达式的类型长度时可以不用加里面的括号;
sizeof的表达式是不会参与计算:
在这里我们可能会认为最后a输出的结果会是40;
但是其实这里的表达式a=b+20.0是不会去计算的,在计算机去运行之前就已经处理掉了sizeof;
而这个表达式的字符类型长度其实是由a决定的,a的类型长度为2,也就是16个比特位;后面的2给浮点数类型相加还是浮点数,但是最后我们将一个浮点数类型数据存入了一个短整型数据,一个是16比特位一个是32比特位,最后存入的数据放不下会有溢出,最后只会留下32个比特位中的16个比特位。