一、数据类型
首先思考一个问题,为什么要对数据进行分类?
1、在现实社会中数据本身就是自带类别属性,比如:人数基本上都是整数,总不能说半个人吧。
2、对数据进行分类可以节约存储空间、提高运行效率。数据类型在内存的存储如下图,不同的数据类型所占的存储空间不同。如果不给不同数据定义类型,可能会出现两种情况:一是存储空间太小导致数据丢失,二是存储空间过大导致空间浪费。这两种情况我们都不希望出现,所以定义了数据类型来规范数据,节约存储空间、提高运行效率。
存储空间的单位
符号 | 说明 |
---|---|
Bit | 一个二进制位,只能存储0或1,是计算存储数据的最小单位 |
Byte | 八个二进制位,是计算机存储数据的基本单位 |
KB | 1KB = 1024 Byte |
MB | 1MB = 1024 KB |
GB | 1GB = 1024 MB |
TB | 1TB = 1024 GB |
PB | 1PB = 1024 TB |
不同数据类型的字节数
可以使用sizeof运算符计算类型的字节数。
1)整型
整型有两种:有符号(signed)和无符号(unsigned),差别在于有符号的数据最高位是符号位,能表示负数。无符号的数据最高位不是符号位,只能表示非负数。
默认不加前缀的整型都为有符号的(signed),无符号的需要加unsigned。
数据类型 | 存储大小 | 表示范围 |
---|---|---|
signed char | 1个字节 | -128~127 |
signed short | 2个字节 | -32768~32767 |
signed int | 4个字节 | 正负20亿左右 |
signed long | 4/8个字节(看操作系统,32位是4个字节,64位是8个字节) | 正负20亿/正负9开头的19位整数 |
signed long long | 8个字节 | 正负9开头的19位整数 |
unsigned char | 1个字节 | 0~255 |
unsigned short | 2个字节 | 0~65535 |
unsigned int | 4个字节 | 0-40亿左右 |
unsigned long | 4/8个字节(看操作系统,32位是4个字节,64位是8个字节) | 0-40亿/0-1开头的20位整数 |
unsigned long long | 8个字节 | 0-1开头的20位整数 |
注意:由于定义无符号数据时比较麻烦,标准库(stdint.h)把这些无符号的类型重新定义成了以下类型:
无符号: uint8_t uint16_t uint32_t uint64_t
有符号: int8_t int16_t int32_t int64_t
2)浮点型
浮点型数据采用科学计算方法存储,二进制与真实数据之间需要换算,因此浮点型数据耗时要比整型数据多得多,编码时尽量选择整型。一般精确到小数点后六位
数据类型 | 存储大小 |
---|---|
float | 4个字节 |
double | 8个字节 |
long double | 12/16个字节 |
3)模拟型
字符型char
字符其实就是符号或图案,内存中存储的是整数,当需要显示成字符时,会根据数字和ASCII码表中对应的关系显示相应的符号或图案。
例如:
符号 | 含义 | ASCII码值 |
---|---|---|
‘\0’ | 空格 | 0 |
‘0’ | 字符0 | 48 |
‘A’ | 字符A | 65 |
‘a’ | 字符a | 97 |
完整ASCII码表如下:
布尔型bool
由于先有C语言之后才有了bool类型,所以C语言中是没有真正的bool类型。在此之前的C语言中,使用整型来表示真假。在输入时:使用非零值表示真;零值表示假。在输出时:真的结果是1,假的结果是0;如果需要使用bool类型需要先调用stdbool.h头文件。
数据类型转换
数据类型转换分为两类:自动类型转换和强制类型转换。
自动类型转换:
只有相同类型的数据才能运算,不同类型的数据必须转换成相同的类型才能进行计算
转换规则:(以不丢失数据为前提,适当牺牲一些空间)
1、字节少的向字节多的转换
2、有符号向无符号的转换
3、整型向浮点型转换
强制类型转换:(新类型)数据
强制类型转换有丢失数据的风险,要慎重使用
二、变量
变量:程序在运行期间数据可以变化的叫做变量,相当于存储数据的容器
定义: 数据类型+变量名(如:int a;)
使用方法:赋值(如 num = 100;)、运算(如 num * 10;)
注意:变量的默认值是随机的,为了安全起见要在变量定义时进行初始化(定义时给变量赋值叫作初始化),一般默认设0。
变量的命名规则
- 由字母、数字、下划线组成
- 不能以数字开头
- 不能与系统关键字重命(32个)
数据类型相关的:
内建类型(7个):
void char short int long float double
自建类型(4个):
struct union enum sizeof
类型限定符(9个):
signed unsigned auto const static volatile register extern typedef
流程控制相关:
分支(5个):
if else switch case default
循环(3个):
for while do
跳转(4个):
break continue return goto - 见名知意(功能、类型、范围…),看到变量名就能明白变量的功能、类型、范围
注意:前三点为命名的硬性规定,任何变量名都不能违反。第四点见名知意只是命名建议。
变量的输入、输出
类型占位符
C语言中通过类型占位符的方式来传递变量的类型
变量名 | 占位符 | 变量名 | 占位符 |
---|---|---|---|
char | %hhd | unsigned char | %hhu |
short | %hd | unsigned short | %hu |
int | %d | unsigned int | %u |
long | %ld | unsigned long | %lu |
long long | %lld | unsigned long long | %llu |
float | %f | double | %lf |
long double | %Lf | char | %c |
格式化输入输出
类型占位符可以通过添加参数来实现不同效果
占位符 | 效果 |
---|---|
%nd | 显示n个字符宽度,不够则补空格,右对齐 |
%-nd | 显示n个字符宽度,不够则补空格,左对齐 |
%0nd | 显示n个字符宽度,不够则补0,右对齐 |
%n.mf | 显示n个字符宽度(小数点也占一个字符宽度),不够则补空格,m表示小数点后位数(四舍五入) |
%g | 不显示小数点后多余的0 |
输出函数 printf()
int printf(const char *format, …);
功能: 输出数据
format:“双引号包含的格式信息(提示信息+占位符)”
… : 可变长参数(若干个参数)
返回值:返回一个int 值,输出字符的个数
输入函数 scanf()
int scanf(const char *format, …);
功能: 输入数据
format:“双引号包含的格式信息(占位符)”
… : 变量地址列表
返回值:返回一个int 值,成功输入的变量个数
注意:scanf需要的是变量类型、变量地址(变量地址 = &变量名)
三、常量
常量:程序运行期间数值不能变化的叫常量(如:1、2、3、4…)。
当你使用整数100时,它默认的数据类型是 int型。可以通过修改后缀来改变常量的数据类型。
例如: 100u 的数据类型是 unsigned int ;100l 的数据类型是 long ; 100lu 的数据类型是 unsigned long;
当你使用浮点数3.14时,它默认的数据类型是 double型。同样地,也可以通过修改后缀来改变常量的数据类型。
例如: 3.14f 的数据类型是 float ;3.14l 的数据类型是 long double ;
结语
希望这篇文章对你有所帮助