数据类型
分类
- 基本类型
整数类型 int,浮点数类型 float,字符类型 char,布尔类型 _Bool,枚举类型 enum - 指针类型
- 构造类型
数组类型,结构类型,联合类型 - 空类型
占用字节
类型名称 | 说明符 | 字节 | 取值范围 |
---|---|---|---|
[signed] char | int8_t / s8 | 1 | [-128 , 127] |
unsigned char | uint8_t / u8 | 1 | [0 , 255] |
[signed] short [int] | int16_t / s16 | 2 | [-32,768 , 32,767] |
unsigned short [int] | uint16_t / u16 | 2 | [0 , 65,535] |
[signed] int | int32_t / s32 | 4 | [-2,147,483,648 , 2,147,483,647] |
unsigned int | uint32_t / u32 | 4 | [0 , 4,294,967,295] |
[signed] long [int] | 4 | ||
unsigned long [int] | 4 | ||
[signed] long long [int] | int64_t | 8 | [-9,223,372,036,854,775,808 , 9,223,372,036,854,775,807] |
unsigned long long [int] | uint64_t | 8 | [0 , 18,446,744,073,709,551,615] |
float | 4 | -3.4*10(-38) ~ 3.4*10(38) | |
double | 8 | -1.7*10(-308) ~ 1.7*10(308) | |
long double | 12 / 16 | ||
_Bool | 1 |
其中,整形类型占用字节与计算机有关;signed表示有符号,unsigned表示无符号。
位与字节
名称 | 表示 | 说明 |
---|---|---|
位 | bit | 最小存储或处理单位 |
字节 | byte 1byte=8bit | 最小寻址单位 |
字 | word 1word=2byte |
sizeof
计算数据类型或表达式长度的运算符,返回长度,单位为byte。
sizeof(type_name); //sizeof(类型); eg: sizeof(int);
sizeof(object); //sizeof(对象); eg: sizeof(i);
sizeof object; //sizeof 对象; eg: sizeof i;
数值数据编码
-
原码
符号位(最高位,0为正数,1为负数)+数据位 -
反码
正数:[X]反 = [X]原
负数:[X]反 = [X]原_符号位不变,数据位各位取反 -
补码
原码和反码的运算规则相对复杂,计算机存储数据采用补码形式
正数:[X]补 = [X]原
负数:[X]补 = [X]反 + 1 -
非数值数据编码
ASCII标准码
汉字编码:汉字国标码,汉字机内码等
变量与常量
变量
-
命名
只能由英文字母、数字和下划线组成;
只能由英文字母或下划线开头;
英文字母区分大小写,通常由小写字母命名变量,大写字母表示符号常量;
避免使用关键字,C语言关键字总计 32+5+7=44 个。 -
声明
//数据类型 变量名;
int a;
char b;
- 关键字
auto | break | case | char | const | continue | default | do |
double | else | enum | extern | float | for | goto | if |
int | long | register | return | short | signed | sizeof | static |
struct | switch | typedef | union | unsigned | viod | volatile | while |
inline | restrict | _Bool | _Complex | _Imaginary | |||
_Alignas | _Alignof | _Atomic | _Static_assert | _Noreturn | _Thread_local | _Generic |
常量
-
分类
整形常量 eg:3 const int a=1; const限定变量不允许改变,产生静态作用。
实行常量 eg:3.14
字符常量 eg:普通字符:‘A’ ;转义字符:’\n’
字符串常量 eg: “Hello World”
符号常量 宏定义 #define 标识符 常量 -
转义字符
转义字符 | 描述 |
---|---|
\a | 响铃(BEL) |
\b | 退格(BS),将当前位置移到前一列 |
\f | 换页(FF),将当前位置移到下一页开头 |
\n | 换行(LF),将当前位置移到下一行开头 |
\r | 回车(CR),将当前位置移到本行开头 |
\t | 水平制表(HT) |
\v | 垂直制表(VT) |
\ | 代表一个反斜杠字符 |
’ | 代表一个单引号字符 |
" | 代表一个双引号字符 |
? | 代表一个问号字符 |
\0 | 空字符(NUL) |
\ddd | 八进制所代表的任意字符 |
\xhh | 十六进制所代表的任意字符 |
- \ 用于行尾,表示下一行是本行的延续。
运算符
打印
表示 | 描述 |
---|---|
%d | 有符号整型 |
%u | 无符号整型 |
%c | 字符 |
%s | 字符串 |
%f | 浮点型 |
%.2f | 精确到两位小数 |
%11.9f | 含小数点共11位,小数9位 |
%x | 打印Hex数据 |
%p | 以地址形式打印 |
宏定义
#define 预处理命令,只是简单地将标识符替换为定义的常量或表达式
#undef 终止宏定义
不带参数的宏定义
#define PI 3.14
带有参数的宏定义
#include <stdio.h>
#define MAX(x, y) (((x)>(y))?(x):(y))
int main(void)
{
printf("%d 是较大的数\n", MAX(3,5));
return 0;
}
/*
运行结果
5 是较大的数
*/
#和##
预处理运算符
在带有参数的宏定义中,#后的参量将转换成字符串;
##为记号连接运算符,用于连接两个参量。
#include <stdio.h>
#define STR(s) # s
#define LINK(x, y) x ## y
int main(void)
{
printf("%s\n", STR(Hello));
printf(STR(Hello\n));
printf(STR(Hello %s\n), STR(World));
printf("%d\n", LINK(99, 6));
return 0;
}
/*
运行结果
Hello
Hello
Hello World
996
*/
可变参数
#include <stdio.h>
#define SHOWLIST(...) printf(# __VA_ARGS__)
int main(void)
{
SHOWLIST(Hello World, 你好, PI=3.14);
return 0;
}
/*
运行结果
Hello World, 你好, PI=3.14
*/
#include <stdio.h>
#define PRINT(format, ...) printf(# format, ##__VA_ARGS__)
int main(void)
{
PRINT(PI = %.2f\n, 3.14);
PRINT(Hello World\n);
return 0;
}
/*
运行结果
PI = 3.14
Hello World
*/