目录
介绍
C语言中数据类型分为内置类型和自定义类型。内置类型又分为整型、字符型、浮点型、布尔类型。自定义类型又分为数组、结构体、枚举和联合体。本篇文章主要介绍内置类型以及有一些C语言中的最基本的常识。
1 sizeof
1.1 关于sizeof的基本问题
不同的数据类型会有不同的长度,根据长度可以确定不同数据类型在内存中的存储长度,方便内存的管理避免造成不必要的内存浪费。C语言中提供了一个操作符sizeof用来计算不同数据类型的长度,单位是字节。sizeof操作符的操作对象可以是数据类型,也可以是变量或者表达式。如果操作对象是数据类型或者表达式需要加上括号,单个常变量可以省略括号。
#include<stdio.h>
int main() {
int num = 10;
int sum = 0;
printf("num=%d\n", sizeof(num));
printf("num=%d\n", sizeof num);//常变量表达式可以去掉括号
printf("int=%d\n", sizeof(int));//数据类型需要加上括号
printf("1+1.2=%d\n", sizeof (1 + 1.2));//表达式需要加上括号
printf("1+1=%d\n", sizeof(1 + 1));
printf("num+1=%d\n", sizeof (sum=num+1));
printf("sum=%d\n", sum);
return 0;
}
测试结果:
得到的结论:
1、1+1.2这一个表达式既有整形又有浮点型占了8个字节,说明当表达式中运算的数值的数据类型不同时需要分别占存储空间,整形1占四个字节,1.2占四个字节,所以sizeof的返回值为8。
2、sizeof中的表达式不进行计算而是根据表达式的类型直接返回所占的字节数。所以num+1的长度为4但是sum的返回值仍然是0。
1.2 关于sizeof的返回值的问题
sizeof的返回值是sizeof_t类型的,返回值的规定是一个无符号的整形,但具体是unsigned int、unsigned long、unsigned long long根据计算机系统的不同都有差异,所以printf时用不同的占位符u 或%lu 或%llu会造成麻烦。因此C语言规定了sizeof的返回值是sizeof_t类型的 ,用printf打印时最好使用%zd来打印。
2 signed与unsigned
signed与unsigned是用来修饰整型或字符型的,signed指的是一种类型有正负值包含正负号,unsigned表示一种数据类型只有正值没有负值只能表示0和正整数。
对于整形来说int本身默认带正负号所以声明变量时int和signed int的作用一样只写int就可以用来表示一个负值可以省略signed。如果只想用int表示一个非负整数可以用unsigned int(int可以省略)来声明一个正整数变量的类型这样做的好处是可以使该正数表示的范围增加一倍。
对于字符型来说char类型是否带有正负号由系统来决定,不同的系统char有可能是signed char,也有可能是unsigned char跟整形变量有所区别。
3 整型
3.1 整形的类型
整形包括短整型,整形,长整型三种,分别有不同的表示方法。
类型 | 表示方法 | 可以省略的部分 |
短整型 | short int | 可省略int |
signed short int | 可省略signed或int | |
unsigned short int | 可省略unsigned或int | |
整型 | int | 不能省略 |
signed int | 可省略signed | |
unsigned int | 不能省略 | |
长整型 | long int | 可省略int |
signed long int | 可省略signed或int | |
unsigned long int | 可省略unsigned或int | |
长长整形 | long long int | 可省略int |
signed long long int | 可省略signed或int | |
unsigned long long int | 可省略unsigned或int |
规律:整形的int不能省略但signed int的signed可以省略。其余的短整型、长整型、长长整形的int、signed都可以省略。
3.2 整型的长度
#include<stdio.h>
int main() {
printf("short = %zd bite\n", sizeof(short));
printf("int = %zd bite\n", sizeof(int));
printf("long = %zd bite\n", sizeof(long));
printf("long long = %zd bite\n", sizeof(long long));
printf("unsigned short = %zd bite\n", sizeof(unsigned short));//测试一个unsigned看是否有变化
printf("signed short = %zd bite\n", sizeof(signed short));//测试一个signed看是否有变化
return 0;
}
结论:所有的短整型在内存中占2个字节;所有的整形在内存中占4个字节;所有的长整型在内存中占4个字节;所有的长长整形在内存中占有8个字节。
3.3 整形的取值范围
可通过查看limits.h这一个文件来显示系统上不同整型类型的的取值范围。
4 字符型
4.1 char
字符型的包括有符号字符型和无符号字符型。
类型 | 表示方法 | 可以省略的部分 |
字符型 | char | 无 |
有符号字符型 | signed char | 根据系统而言 |
无符号字符型 | unsigned char | 根据系统而言 |
4.2 字符型的长度
#include<stdio.h>
int main() {
printf("char=%zd bite\n", sizeof(char));
printf("signed char=%zd bite\n", sizeof(signed char));
printf("unsigned char=%zd bite\n", sizeof(unsigned char));
return 0;
}
我们可以发现所有的char类型都占一个字节。
4.3 字符型的取值范围
可通过查看limits.h这一个文件来显示系统上字符型的取值范围。操作和上面的一样。
5 浮点型
5.1 float
浮点型数据就是我们常说的小数,在C语言中将小数划分为单精度浮点型、双精度浮点型、长双精度浮点型。
类型 | 表示方法 |
单精度浮点型 | float |
双精度浮点型 | double |
长双精度浮点型 | long double |
5.2 浮点型的长度
#include<stdio.h>
int main() {
printf("float = %zd bite \n", sizeof(float));
printf("double = %zd bite \n", sizeof(double));
printf("long double = %zd bite \n", sizeof(long double));
return 0;
}
测试结果:
结论:单精度浮点型在内存中占4个字节,双精度浮点型和长双精度浮点型在内存中占8个字节。
6 布尔类型
6.1 _Bool
使用布尔类型必须要包含头文件<stdbool.h>,布尔类型实在C99中引入的是专门用来表示真假的,bool类型的取值只有可能有两个即true或false。声明bool类型变量时应该用_Bool。举个栗子:
#include<stdio.h>
#include<stdbool.h>
int main() {
_Bool test = true;
if (test)
printf("happy\n");
return 0;
}
运行结果:
6.2 布尔类型的长度
#include<stdio.h>
#include<stdbool.h>
int main() {
printf("_Bool = %zd bite\n", sizeof(_Bool));
return 0;
}
运行结果:
结论:所有的布尔类型在内存中占一个字节。