数据类型
为什么要对数据进行分类?
1、在自然界中数据本来就是分类的
2、对数据进行分类可以节约空间,提高运行效率
C语言中把数据分为自建(程序员自己设计的类型,例如结构、联合、类)、内建(C语言自带的)
注:c语言中32个关键词从这可引出
整型
signed 有符号:
signed char 1 -128~127
signed short 2 -32768~32767
signed int 4 正负20亿
signed long 4/8 正负20亿/以9开头正负19位数
signed long long 8 以9开头19位数
注意:signed 不加代表了加
unsigned 无符号:
unsigned char 1 0~255
unsigned short 2 0~65535
unsigned int 4 0~40亿
unsigned long 4/8
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
浮点型:
float 4
double 8
long double 12/16
小数点后6位有效,六位之后约掉
模拟型
char 字符型:
所谓的字符就是符号或图案,在内存中是以整数形式存储的,需要显示字符时,会根据ASCII码表中的对应关系来显示出对应的符号或图案
0 ‘\0’ 特殊字符
48 ‘0’ (根据这些可以计算其他的字符)
65 ‘A’
97 ‘a’
bool 布尔型:
先有的C语言才发明的bool类型,所以C语言没有真正的布尔类型,必须加上头文件<stdbool.h>才能使用。
bool - > true =1 false= 0 (大部分系统中)
sizeof(unsigned int) 计算类型、变量所占的字节数
注;该函数与strlen函数都是计算自己的,该函数中的表达式是不会运行的,直接显示后面的值,如
sizeof((a>5)?4:8.0);
返回值是8,即8.0的字节数
常量与变量
什么是变量呢
相当于存储数据的盒子,在程序运行期间数值可以发生改变
变量的定义:
类型 变量名;
int num;
变量名的取名规则:
1、由字母、数字、下划线组成。
2、不能以数字开头。
3、不能与32个关键字重名 最好也不要跟这些函数名重名,比如printf、scanf、sizeof、bool。
4、见名知意(功能、类型、范围)
注意:变量的值是随机的,为了安全起见,一般初始化为0。
int num = 0;
使用:
赋值: num = 10;
参与运算 num -> 10
变量的输入输出:
输出:
int printf(const char *format, ...);
功能:输出数据
format:"双引号包含的提示信息+占位符"...: 变量列表
返回值: 输出字符的个数
注:常用printf函数来检测bug出现在哪里。
格式化的输出:
%nd 显示n个字符宽度,不足则补空格,右对齐
%-nd 显示n个字符宽度,不足则补空格,左对齐
%0nd 显示n个字符宽度,不足则补0,右对齐
%n.mf 显示n个字符宽度,不足补空格,m表示小数点后的位数
%g 不显示小数点后多余的0
输入:
int scanf(const char *format, ...);
功能:输入数据
format:"双引号包含的占位符"
...: 变量地址列表 变量的地址 = &变量名
返回值:成功输入的数据的个数
什么常量呢
程序运行期间数值不能发生改变的叫常量(存储在text代码段),若强行改变就会出现段错误。
例如:
100 默认int
100l long
100ll long long
100u unsigned int
100lu unsigned long
100llu
3.14 默认double
3.14f float
类型转换
自动类型转换:
只有相同的类型的数据才能进行运算,不同类型的数据需要转换成相同类型才能运算
转换规则:以不丢失数据为基础,适当地牺牲一些空间
1、字节少向字节多的转
2、有符号向无符号转
3、整型向浮点型转
( / % 除数不能为0,否则产生 "浮点数例外,核心已转储的报错信息)
强制类型转换:
(新类型)数据
有丢失数据的风险,谨慎使用
指针类型的强制转换
int m;
int *pm = &m;
char *cp = (char *)&m;
结构体之间的强制转换:
struct str1 a;
struct str2 b;
a=*((struct str1*)&b);