主要内容:C语言数据类型及长度,变量的简要介绍
第2讲:C语言数据类型和变量(上篇)
1. 数据类型介绍
C语言提供丰富数据类型描述各种数据,如用整型描述整数、字符型描述字符、浮点型描述小数。“类型”是相似数据的共同特征,编译器需知道数据类型才能操作数据。本章节主要探讨内置数据类型,包括字符型、整型、浮点型、布尔类型,至于自定义类型如数组、结构体、枚举、联合体等,我们之后的文章再说。
ps:1 下面[ ]的内容理解含义即可,写代码时通常可以省略。
1.1 字符型
- char:字符型基本类型。
- [signed] char:有符号字符型,正负字符值,(signed通常省略)。
- unsigned char:无符号字符型,仅零和正字符值。
1.2 整型
- short [int]、[signed] short [int]:短整型,可带或不带正负号。
- unsigned short [int]:无符号短整型,即只能是0或正数。
- int、[signed] int:整型,默认带正负号,signed通常省略。
- unsigned int:无符号整型,可省略int写成unsigned。
- long [int]、[signed] long [int]:长整型。
- unsigned long [int]:无符号长整型。
- long long [int]、[signed] long long [int](C99引入):更长的整型。
- unsigned long long [int]:无符号更长的整型。
1.3 浮点型
- float:单精度浮点型。
- double:双精度浮点型。
- long double:长双精度浮点型。
1.4 布尔类型
C语言原本用整数0表示假,非零值表示真。C99引入布尔类型_Bool,使用时需包含头文件<stdbool.h> ,变量取值为true或false。可通过宏定义简化使用,如#define bool _Bool
、#define false 0
、#define true 1
。示例代码:
_Bool flag = true;
if (flag)
printf("i like C\n");
1.5 各种数据类型的长度
每种数据类型都有长度,影响变量存储数据范围。
1.5.1 sizeof操作符
sizeof是关键字也是操作符,用于计算操作数类型长度,单位是字节。操作数可以是类型、变量或表达式。计算结果是size_t类型,不同系统中sizeof返回值类型可能不同,C语言用size_t统一表示。示例代码:
#include <stdio.h>
int main()
{
int a = 10;
printf("%zd\n", sizeof(a));
printf("%zd\n", sizeof a);
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(3 + 3.5));
return 0;
}
为什么最后一个是8呢?这里要说明两点:
(1)sizeof不关心他的操作数本身是什么,只关心操作数的数据类型
(2) 8是因为3.5浮点数是double类型,长度为8。
1.5.2 数据类型长度
在VS2022 X64配置下,不同数据类型长度如下:
- 1字节:_Bool
- 2字节:short
- 4字节:int、long
- 8字节:long long、double
- 16字节:long double
示例代码:
#include <stdio.h>
int main()
{
printf("%zd\n", sizeof(char));
printf("%zd\n", sizeof(_Bool));
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;
}
1.5.3 sizeof中表达式不计算
sizeof在编译时根据表达式类型确定结果,表达式在运行期间才执行,所以运行时不会执行表达式。示例代码:
#include <stdio.h>
int main()
{
short s = 2;
int b = 10;
printf("%d\n", sizeof(s = b+1));
printf("s = %d\n", s);
return 0;
}
2. signed和unsigned
C语言用signed和unsigned关键字修饰字符型和整型。signed表示类型带正负号,包含负值;unsigned表示类型不带正负号,只能表示零和正整数。int类型默认带正负号,等同于signed int ,signed可省略。unsigned int可省略int写成unsigned。同样,字符类型char也可设置signed和unsigned,char默认是否带正负号由系统决定,与int不同。不同类型取值范围不同,如16位的signed short int取值范围是-32768~32767,而unsigned short int取值范围是0~65535。在VS2022环境中,limits.h定义了相关整型的最值,如#define SHRT_MIN (-32768)
、#define SHRT_MAX 32767
等。
3. 数据类型的取值范围
不同数据类型有不同取值范围,limits.h文件说明了整型类型的取值范围,float.h头文件说明浮点型类型的取值范围。为保证代码可移植性,获取整数类型极限值时应尽量使用这些文件中的常量,如SCHAR_MIN
、SCHAR_MAX
、SHRT_MIN
、SHRT_MAX
等。
4. 变量
4.1 变量的创建
变量用于存储经常变化的值,创建语法为data_type name;
,创建时可初始化。示例:
int age;
char ch;
double weight;
int age = 18;
char ch = 'w';
double weight = 48.0;
unsigned int height = 100;
4.2 变量的分类
- 全局变量:在大括号外部定义,使用范围广,整个工程都可使用,存储在内存静态区。
- 局部变量:在大括号内部定义,使用范围局限于所在局部范围,存储在内存栈区。当局部变量和全局变量同名时,局部变量优先使用。示例代码:
#include <stdio.h>
int global = 2023;
int main()
{
int local = 2018;
printf("%d\n", local);//2018
printf("%d\n", global);//2023
return 0;
}
#include <stdio.h>
int n = 1000;
int main()
{
int n = 10;
printf("%d\n", n);//n=10
return 0;
}