
任何一门编程语言的学习都始于对其基本构建块的认识。C语言中,数据类型和变量无疑是最关键的两个概念。在C语言中,选择一个 int 还是 short ,是 float 还是 double ,绝非随意之举。变量也不仅仅是一个名字,它是内存地址的符号化标签,是程序与硬件交互的直接界面。
C语言提供了丰富的数据类型来描述生活中的各种数据。使⽤整型类型来描述整数,使⽤字符类型来描述字符,使⽤浮点型类型来描述⼩数。
所谓“类型”,就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道怎么操作数据。
如果C语言是一种魔法,那么数据类型便是魔法的基本元素,每种元素都有其独特的性质和用途。
下面盘点C语言提供的各种数据类型。

字符型就像风元素,它轻盈、灵动,专门用于传递信息和表达符号。单个字符就像一缕清风,可以是一个英文字母(如a、b、c)、数字符号(如1、2、3)、特殊符号(如@、#、%)或者是各种语言的文字符号(如汉字"风"、日文假名"あ")。当这些字符组合起来形成字符串(char数组)时,就像一段完整的咒语或是能产生实际效果的强风,可以表达更复杂的信息。
char //character,字符英文单词
[signed] char //有符号的,signed可写可不写
unsigned char //无符号的,不可省略整型就像土元素,它最基础、最坚实、最可靠。作为编程中最基础的数据类型之一,整型直接对应数学中的整数概念,不包含小数部分。
//整数 - integer,整数的英文单词
//短整型:
short [int]
[signed] short [int]
unsigned short [int]
//整型
int
[signed] int
unsigned int
//长整型
long [int]
[signed] long [int]
unsigned long [int]
long long [int]
[signed] long long [int]
unsigned long long [int]浮点型就像水元素,它流动、不精确,但可以表示程度和分量。用于计算距离、温度、金额等,用于处理需要小数精度的数值计算,恰如水的流动性和可塑性。
float //单精度浮点型
double //双精度浮点型
long double //精度更高的浮点型空类型就像虚无元素,它不指向任何具体元素,但可以作为魔力的通道(函数返回值),或指向未知(指针),类似与一个能容纳任何元素但本身为空的神秘容器。
void func(...) //指定函数不返回任何值
int func(void) //指定函数不接受任何参数
void* //通用指针类型布尔类型类似于规则魔法,其核心在于定义世界的二元性、确立绝对的是非界限。C语言原来并没有布尔类型,而是使用整数0表示假,非0表示真。
_Bool
bool_Bool是C99标准引入的基本数据类型,用于表示布尔值(true或false)。它只能存储0(false)或1(true)。使用 _Bool 需要包含<stdbool.h>头文件以启用 bool、true和false 的宏定义。bool是<stdbool.h>头文件中定义的宏,实际上是_Bool的别名。 true 和 false 也是宏,分别定义为1和0。
即使用布尔类型需要包含<stdbool.h>头文件。 布尔类型变量的取值是:true或false。
代码演示:
_Bool flag = true;
if(flag)
printf("I like you\n");每一种数据类型都有自己的长度,使用不同的数据类型,能够创建出长度不同的变量,变量长度的不同,储存的数据范围就有差异。
sizeof 是一个关键字,也是操作符,专门是用来计算 sizeof 的操作符数的类型长度,单位是字节。在魔法中相当于洞察术,能够确保自己的代码既高效又稳定。
sizeof 操作符的操作数可以是类型,也可以是变量。
sizeof(类型)
sizeof 表达式sizeof 的操作数如果是表达式时,可以省略后边的括号。 sizeof 后边的表达式是不真实参与运算的,是**根据表达式的类型来得出大小。 sizeof 的计算结果是 size_t 类型的。size_t 类型的值打印的时候使用 %zd (在有些环境中%zu=%zd)
sizeof 运算符的返回值,C语言只规定是无符号整数,并没有规定具体的类型,而是留给系统自己去决定,sizeof 是什么值。在不同的系统中,返回值的类型有可能是 unsigned int,也有可能是 unsigned long,甚至是 unsigned long long,对应的 printf()占位符分别是 %u、%lu和%llu。不利于程序的可移植性。
因此C语言提供一个解决办法,创造一个类型别名 size_t ,用来统一表示 sizeof 的返回值类型。
不同的数据类型有不同的字节长度,不同编译器的字节长度可能不同。
#include<stdio.h>
#include<stdbool.h>
int main()
{
printf("%zd\n", sizeof(bool));
printf("%zd\n", sizeof(char));
printf("%zd\n", sizeof(short));
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(long));
printf("%zd\n", sizeof(long long));
printf("%zd\n", sizeof(float));
printf("%zd\n", sizeof(double));
printf("%zd\n", sizeof(long double));
return 0;
}这是在VS2022 X64配置下的输出:

C语言规定长度 : sizeof(long) 大于等于 sizeof(int) sizeof(long double) 大于等于 sizeof(double)


因为 sizeof 不参与计算,又 s 是 short ,则 sizeof(s = num + 2) 在编译时就被替换成 sizeof(short)。short 在VS2022环境中是2字节,故打印值为2。
故 sizeof 在代码进行编译的时候,就根据表达式的类型确定了。而表达式的执行却要在程序运行期间才能执行,在编译期间已经 sizeo f处理掉了,所以在运行期间就不会执行表达式了。
C语⾔使⽤ signed 和 unsigned 关键字修饰字符型和整型类型的。 signed 关键字,表⽰⼀个类型带有正负号,包含负值;unsigned 关键字,表⽰该类型不带有正负号,只能表⽰零和正整数。两者相当于魔法元素的本源属性,是平衡的双极能量还是纯粹的单极能量。 对于 int 类型,默认是带有正负号的,也就是说由于这是默认情况,关键字 int 等同于 signed int 。关键字 signed 一般都省略不写,但是写了也不算错。
signed int a;
//等同于int aint 类型也可以不带正负号,只表示非负整数。这是就必须使用关键字 unsigned 声明变量。
unsigned int a;整数变量声明为unsigned 的好处是,同样⻓度的内存能够表示的最⼤整数值,增⼤了⼀倍。⽐如,16位的signed short int 的取值范围是:-32768~32767,最⼤是32767;而unsigned short int 的取值范围是:0~65535,最⼤值增⼤到了65,535。32位的int 的取值范围可以参看limits.h 中给出的定义。
下⾯的定义是VS2022环境中,limits.h中相关定义。
#define SHRT_MIN (-32768) //有符号16位整型的最⼩值
#define SHRT_MAX 32767 //有符号16位整型的最⼤值
#define USHRT_MAX 0xffff //⽆符号16位整型的最⼤值
#define INT_MIN (-2147483647 - 1) //有符号整型的最⼩值
#define INT_MAX 2147483647 //有符号整型的最⼤值 unsigned int 里面的 int 可以省略,所以上面的变量声明也可以写成下面这样。
unsigned a;字符类型 char 也可以设置 signed 和 unsigned。
signed char c;//范围为-128到127
unsigned char c;//范围为0到255注意,对于 char 类型,是否等同于 signed char 不确定。char 为 signed char 还是 unsigned char 取决于编译器。但大部分编译器上 char = signed char(VS2022就是这样)。这一点与 int 不同。
上述的数据类型很多,尤其数整型类型就有short、int、long、longlong四种,为什么呢? 其实每⼀种数据类型有⾃⼰的取值范围,也就是存储的数值的最⼤值和最⼩值的区间,有了丰富的类型,我们就可以在适当的场景下去选择适合的类型。如果要查看当前系统上不同数据类型的极限值: limits.h ⽂件中说明了整型类型的取值范围。 float.h 这个头⽂件中说明浮点型类型的取值范围。 为了代码的可移植性,需要知道某种整数类型的极限值时,应该尽量使⽤这些常量。 • SCHAR_MIN ,SCHAR_MAX :signed char 的最⼩值和最⼤值。 • SHRT_MIN ,SHRT_MAX :short 的最⼩值和最⼤值。 • INT_MIN ,INT_MAX :int 的最⼩值和最⼤值。 • LONG_MIN ,LONG_MAX :long 的最⼩值和最⼤值。 • LLONG_MIN ,LLONG_MAX :longlong 的最⼩值和最⼤值。 • UCHAR_MAX :unsigned char 的最⼤值。 • USHRT_MAX :unsigned short 的最⼤值。 • UINT_MAX :unsigned int 的最⼤值。 • ULONG_MAX :unsigned long 的最⼤值。 • ULLONG_MAX :unsigned long long 的最⼤值。
了解清楚了类型,我们使⽤类型做什么呢?类型是⽤来创建变量的。 什么是变量呢?C语⾔中把经常变化的值称为变量,不变的值称为常量。相当于一个储存和操控元素的容器或符文,从而来储存、调用和操控数据类型。 变量创建的语法形式是这样的:
data_type name;
| |
| |
数据类型 变量名int age; //整型变量
char ch; //字符变量
double weight; //浮点型变量变量在创建的时候就给⼀个初始值,就叫初始化。
int age = 1;
char ch = 'x';
double weight = 52.0;
unsigned int height = 100;全局变量:在⼤括号外部定义的变量就是全局变量 全局变量的使⽤范围更⼴,整个⼯程中想使⽤,都是有办法使⽤的。 局部变量:在⼤括号内部定义的变量就是局部变量 局部变量的使⽤范围是⽐较局限,只能在⾃⼰所在的局部范围内使⽤的。
#include <stdio.h>
int global = 1;//全局变量
int main()
{
int local = 2;//局部变量
printf("%d\n", local);
printf("%d\n", global);
return 0;
}当局部变量和全局变量同名的时候,局部变量优先使⽤。
我们在学习C/C++语⾔的时候,我们会关注内存中的三个区域:栈区、堆区、静态区。

(可能会有一些小毛病,若有发现还望指正,谢谢)