6.C语言-数据类型

223 阅读5分钟

数据类型

一、数据类型分类

image-20230810152811098.png

二、整数类型

八种整型

类型类型简写说明存储大小(字节)
unsigned short intunsigned short无符号短整型2字节
signed short intshort、signed short有符号短整型2字节
unsigned intunsigned无符号整型16位:2字节
32位:4字节
signed intint、signed有符号整型16位:2字节
32位:4字节
unsigned long intunsigned long无符号长整型32位:4字节
64位:8字节
signed long intsigned long、long有符号长整型32位:4字节
64位:8字节
unsigned long long intunsigned long long无符号长长整型8字节
signed long long intsigned long long、long long有符号长长整型8字节

[!TIP]

  1. 不同硬件编译平台的类型存储大小和范围为不同。
  2. 64位windows下long比较特殊,它是4字节。
  3. 4字节int类型范围:-2,147,483,648 (- 2^31) 到 2,147,483,647 (2^31 -1)

字面量后缀

数据类型字面量后缀数据类型字面量后缀
intunsigned intU
longL、lunsigned longUL、ul
long longLL、llunsigned long longULL、LLU、llu、ull

占位符

数据类型格式占位符数据类型格式占位符
int%dunsigned int%u
short%hdunsigned short%hu
long%ldunsigned long%lu
long long%lldunsigned long long%llu

精准宽度整数类型

定义在标准库<stdint.h>中。精准的字节宽度,提高代码的可移植性

类型名称含义
int8_t8 位有符号整数
int16_t16 位有符号整数
int32_t32 位有符号整数
int64_t64 位有符号整数
uint8_t8 位无符号整数
uint16_t16 位无符号整数
uint32_t32 位无符号整数
uint64_t64 位无符号整数

三、浮点类型

数据类型说明存储长度有效小数位数
float单精度4字节6~9
double双精度8字节15~18
long double长双精度32位:10字节
64位:16字节
18及以上

[!TIP]

  1. 浮点类型字面量表示形式:
    • 0.512.512(0可以省略)、5.12e-1(科学计数法,e代表10)
  2. 不同硬件编译平台的类型存储大小和范围为不同。

字面量后缀

类型字面量后缀
floatF、f
double
long doubleL、l

占位符

类型占位符科学计数法
float%f%e
double%lf%le
long double%Lf%Le

浮点存储方式

计算机中的浮点分为S、M、E三部分,以科学计数法存储:==(-1)^S^∗M∗2^E^==

其中S是符号位,M是尾数位表示精度(1≤M≤2),E是指数位表示范围。

例如:(−1)^0^∗1.011∗2^2^ | S = 0,M = 1.011,E = 2

image-20240908155351202.png

image-20240908155401122.png

[!TIP]

IEEE 754规定,在计算机内部保存M时,小数点前默认就是1,因此计算机只保存小数部分

例如:M = 1.01,计算机中只保存01

四、字符类型

  • C语言中,char类型本质是一个整数,是ASCII码中对应的数字,存储长度是 1 个字节,char类型也可以进行数学运算。

  • 字符型同样分为signed char(有符号)和unsigned char(无符号),其中signed char取值范围-128 ~ 127,unsigned char取值范围0 ~ 255。默认是否带符号取决于当前运行环境。

  • 字符型数据在计算中存储和读取的过程:

    wps3-1725868689277-3.png

  • ASCII码是一种用于表示文本字符的字符编码标准,一共规定了128个字符的编码

    image-20240909155705342.png

字面量

char c1 = 'a';
char c2 = 97;
char c3 = '\n';

特殊的转义字符:

转义字符说明
\b退格
\n换行符
\r回车符
\t制表符
\”双引号
\’单引号
\\反斜杠

占位符

printf("%c", 'a');

五、布尔类型

C89标准中没有布尔类型,判断真假以0位假,其他为真。通常借助宏定义。

#define BOOL int
#define TRUE 1
#define FALSE 0

C99标准中定义了_Bool,它是一个字节的整数型,只能赋0或1,非0都会被存储位1。

int main()
{
	_Bool a = 0;
	_Bool b = 1;
}

C99标准还提供一个头文件<stdbool.h>,定义了booltruefalse。bool代表_Bool、true代表1、false代表0。

#include <stdbool.h>

int main()
{
	bool a = false;
	bool b = true;
}

六、获取类型存储大小

sizeof是一个==运算符==,能够获取变量、字面量、类型的存储大小,sizeof返回一个size_t类型(unsigned int或unsigned long的别名,具体由编译器决定)的无符号整型,格式占位符为%zu

//获取字面量存储大小
printf("%zu", sizeof 11);
//数据类型必须加括号
printf("%zu", sizeof (int));
//获取变量存储大小
printf("%zu", sizeof num);

[!IMPORTANT]

printf("%zu", sizeof 'a');获取字符字面量大小时,结果为4。

七、数据类型转换

自动类型转换

运算时,不同类型会进行自动类型转换。

  • 范围小的类型自动转换成范围大的类型
  • 有符号类型转换为无符号类型
  • 整数类型转换为浮点类型

[!IMPORTANT]

char和short即使它们和自己类型运算,也会转换成int型。

赋值时,自动转换成被赋值变量的类型。

强制类型转换

强制类型转换成小范围类型可能会造成数据不准确。

(类型名)变量、常量或表达式