C语⾔数据类型和变量

个人主页:初学的小白白

数据类型与变量:C语言的核心概念

C语言提供了丰富的数据类型来描述生活中的各种数据。使用整型类型来描述整数,字符类型来描述字符,浮点型类型来描述小数。所谓“类型”,是相似数据的共同特征,编译器只有知道了数据的类型,才知道如何操作数据。

本文主要探讨C语言的内置数据类型,包括字符型、整型、浮点型、布尔类型等,并介绍它们的长度、取值范围以及变量的使用。

1.数据类型概述

 1.1 字符型

char //character
[signed] char //有符号的
unsigned char //⽆符号的

1.2 整型

整形-integer->int 整形
short int-短整型
long int-长整型
long long int-更长的整形
//这里的int可以省略


1.3 浮点型

float-单精度浮点型
double-双精度浮点型
long double-更大取值范围的浮点型


1.4 布尔类型

C语言最初并未为布尔值单独设置类型,而是使用整数`0`表示假,非零值(一切非零,而不单单指的1)表示真。C99标准引入了布尔类型,专门用于表示真假值。布尔类型的使用需要包含头文件`<stdbool.h>`,其变量的取值为`true`或`false`。

#define bool _Bool
#define false 0
#define true 1

 代码展示:

_Bool flag = true;
if (flag)
 printf("i like C\n");

①true/非零数时打印“I like c”

②false/0时不打印 

 1.5. 数据类型的长度

每种数据类型都有自己的长度,使用不同的数据类型可以创建不同长度的变量,变量长度的不同会导致存储数据范围的差异。

1.5.1 sizeof操作符

`sizeof`是一个关键字兼操作符,用于计算操作数的类型长度,单位为字节。它可以作用于类型、变量或表达式。如果操作数是表达式,可以省略括号。`sizeof`的计算结果是`size_t`类型,其具体类型由系统决定,可能是unsigned intunsigned longunsigned long long

sizeof( 类型 )
sizeof 表达式

在不同系统中,`sizeof`的返回值类型可能不同,这可能影响程序的可移植性。因此,C语言引入了类型别名`size_t`,以统一表示`sizeof`的返回值类型。

代码展示:

#include <stdio.h>
int main()
{
 int a = 10;
 printf("%zd\n", sizeof(a));
 printf("%zd\n", sizeof a);//a是变量的名字,可以省略掉sizeof后边的()
 printf("%zd\n", sizeof(int));
 printf("%zd\n", sizeof(3 + 3.5));
 return 0;
}
 1.5.2数据类型长度示例

在VS2022 X64配置下,输出如下:

| 数据类型       | 长度(字节) |
|----------------|--------------|
| char           | 1            |
| short          | 2            |
| int            | 4            |
| long           | 8            |
| long long      | 8            |
| float          | 4            |
| double         | 8            |
| long double    | 16           |

想亲自试试的可以用下面的代码:

#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;
}

在VS2022 X64配置下的输出:

1 1 2 4 4 8 4 8 8

1.5.2 `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;
}

`sizeof`在编译时根据表达式的类型确定结果,而表达式的执行则在程序运行期间完成。因此,在运行期间,`sizeof`不会执行表达式,而是直接根据类型返回结果。

2. `signed`和`unsigned`

C语言使用`signed`和`unsigned`关键字修饰字符型整型类型

- `signed`:表示类型带有正负号,可包含负值。
- `unsigned`:表示类型不带正负号,仅表示零和正整数。(可以省略int)

对于`int`类型,默认为`signed int`,因此关键字`signed`通常省略。但`unsigned`关键字必须明确声明,以表示变量仅存储非负整数。

例如:
- 16位的`signed short int`取值范围为`-32768~32767`,最大值为`32767`。
- 16位的`unsigned short int`取值范围为`0~65535`,最大值为`65535`。

在32位系统中,`signed int`的取值范围可参考`limits.h`中的定义。

2.1 字符类型

字符类型`char`也可以设置为`signed`或`unsigned`。但C语言规定,`char`类型默认是否带有正负号由当前系统决定。这意味着`char`可能等同于`signed char`,也可能等同于`unsigned char`。这与`int`不同,`int`默认等同于`signed int`。

 3. 数据类型的取值范围

C语言提供了丰富的整型和浮点型数据类型,每种类型都有自己的取值范围。为了确保代码的可移植性,建议使用`limits.h`和`float.h`中的常量来获取当前系统上的数据类型极限值。

3.1 整型取值范围

`limits.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 :long long 的最⼩值和最⼤值。
UCHAR_MAX :unsigned char 的最⼤值。
USHRT_MAX :unsigned short 的最⼤值。
UINT_MAX :unsigned int 的最⼤值。
ULONG_MAX :unsigned long 的最⼤值。
ULLONG_MAX :unsigned long long 的最⼤值。

3.2 浮点型取值范围

`float.h`文件中定义了浮点型类型的取值范围,包括精度、最大值和最小值等。

 4. 变量

4.1 变量的创建

变量是C语言中用于存储可变值的容器,而常量则是不变的值。变量的创建语法如下:

```c
类型名 变量名;
 

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);
 printf("%d\n", global);
 return 0;
}
#include <stdio.h>
int n = 1000;
int main()
{
 int n = 10;
 printf("%d\n" n);//打印的结果是多少呢?
 return 0;
}

 4.3变量存储区域

 全变量和局部变量存储区域(栈区 堆区 静态区)

局变量是存放在内存的栈区

全局变量是存放在内存的静态区

动态内存分配在内存的堆区