一、标识符
1.1、常量
程序运行时其值不能改变,必须先定义后使用。
- 直接常量
- 符号常量
定义符号常量格式:#define 符号常量 常量
#define 是一条预处理命令(预处理命令都以 # 开头),也称为宏定义命令。它的功能就是把程序中所有出现的标识符都替换为随后的常量
#include <stdio.h>
#define NAME "JHXXB"
#define PI 3.1415926
int main()
{
printf("my name is %s\n", NAME);
return 0;
}
1.2、变量
程序运行过程中,其值可以被改变,必须先定义后使用。
格式:存储类型 数据类型 变量名 = 初值;
对变量的赋值实际上就是将数据写到变量所对应的内存单元中。
1.3、标识符
用来标识变量、常量、函数等的字符序列
- 区分大小写
- 英文(A-Z,a-z)、数字(0-9),下划线(_)组成
- 字母或下划线开头
- 不能使用关键字命名
关键字如下:
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 |
void
|
volatile |
while
|
1999 年 12 月 16 日,ISO 推出了 C99 标准,该标准新增了 5 个 C 语言关键字:
inline | restrict | _Bool | _Complex | _Imaginary |
2011 年 12 月 8 日,ISO 发布 C 语言的新标准 C11,该标准新增了 7 个 C 语言关键字:
_Alignas | _Alignof | _Atomic | _Static_assert | _Noreturn | _Thread_local | _Generic |
二、数据类型
sizeof() 函数可以检测类型大小
https://www.cnblogs.com/jhxxb/p/11154925.html
2.1、基本数据类型(不可以再分解为其他类型)
整型
- 整型(int,32 位上占 4 字节(-2147483648~2147483647),16 位上占 2 字节(-32768~32767))
- 短整型(short,2 byte,-32768~32767)
- 长整型(long,4 byte,-2147483648~2147483647)
实型(浮点型)
- 单精度型(float, 4 byte,10^(-37)~10^38)
- 双精度型(double, 8 byte,10^(-307)~10^308)
字符型(char,占 1 字节,-128~127,a = 'C')
2.2、构造数据类型(复杂数据类型,可以分解为若干个基本数据类型或构造数据类型)
- 数组
- 结构体(struct)
- 联合体(union)
- 位域
- 枚举(enum)
2.3、指针类型(其取值类似于整型,但这是两个完全不同的量,指针的取值代表地址)
2.4、空类型(void,语法完整性,表示不需要具体的数据值)
2.5、定义类型(typedef)
三、简单数据类型(整型、实型(浮点型)、字符型(字符串))与范围表示
3.1、整型常量
表示形式
- 十进制整数(0-9 和正负号):123
- 八进制整数(数字 0 开头,后面 0-7):015(13),-012(-10)
- 十六进制整数:(0x 或 0X 开头,后面 0-9,A-F(a-f)):0X2A(42),-0xA0(-160)
分类
- 整型常量后加字母 l 或 L,就认为是 long int 型常量。例:123L 41l
- 整型常量后加后缀 u 或 U,就认为是无符号常量。例:38U 41u
- 根据范围确定类型(int 或 long),前缀后缀可一起使用,例:0XA5Lu(十六进制无符号长整数 A5,十进制为165)
3.2、整数在内存中的表示(计算机系统规定:整数的数值在内存中以补码的形式存放)
1 字节 = 8 位
- 十进制数(真值):+14
- 机器数表示形式(补码,16 位内存单元):0000000000001110
- 内存实际存放形式(16 位内存单元):
低字节 00001110 低地址 ↓ 高字节 00000000 高地址 ↓
- 机器数表示形式(补码,32 位内存单元):00000000000000000000000000001110
- 内存实际存放形式(32 位内存单元):
低字节 00001110 低地址 ↓ 00000000 ↓ 00000000 ↓ 高字节 00000000 高地址 ↓
- 十进制数(真值):-14
- 机器数表示形式(补码,16 位内存单元):1111111111110010(负数补码:符号位不变,其它位取反,最后加一)
- 内存实际存放形式(16 位内存单元):
低字节 11110010 低地址 ↓ 高字节 11111111 高地址 ↓
- 机器数表示形式(补码,32 位内存单元):11111111111111111111111111110010
- 内存实际存放形式(32 位内存单元):
低字节 11110010 低地址 ↓ 11111111 ↓ 11111111 ↓ 高字节 11111111 高地址 ↓
- 十进制数(真值):-65537 = 2^16 + 1
- 机器数表示形式(补码,32 位内存单元):11111111111111101111111111111111(负数补码:符号位不变,其它位取反,最后加一)
- 内存实际存放形式(16 位内存单元):
低字节 11111111 低地址 ↓ 高字节 11111111 高地址 ↓
- 内存实际存放形式(32 位内存单元):
低字节 11111111 低地址 ↓ 11111111 ↓ 11111110 ↓ 高字节 11111111 高地址 ↓
在 16 位内存单元上, -65537 在内存中的值与 -1 在内存中的值是一样的,因为 -65537 超出了 16 位内存单元表示数的范围,也就是发生了数据溢出。
3.3、整型变量
整型变量的基本类型符是 int,计算机会为这个变量分配相应大小的内存单元。
整型变量的分类(是否有符号:signed(默认)、unsigned;整型变量值域范围:short、long)
- 有符号基本型:int
- 无符号基本型(非负数):unsigned int
- 有符号短整型:short int 或 short
- 无符号短整型(非负数):unsigned short int 或 unsigned short
- 有符号长整型:long int 或 long
- 无符号长整型(非负数):unsigned long int 或 unsigned long
有符号与无符号在计算机内存中表示是不区分的,都是以其补码形式表示,只是运算时有区别(怎样看待最高二进制位)
unsigned int a = -2; printf("%d", a); // -2 printf("%u", a); // 4294967294
3.4、实型常量
两种表现形式
- 十进制小数:0.0、0.25、.13、-.03、5.789
- 十进制指数:2.1E5 表示 2.1*10^5、3.7E-2 表示 3.7*10^(-2)
3.5、实数在内存中的存放形式(按指数形式存放)
通常一个实数需要 4 字节(32位)
分成三部分((+/-) a E n):最高位是符号位,剩下(a E n)的 31 位存实数和尾数(按照 IEEE 标准)
常用浮点数格式:
符号位 | 尾数 | 阶码 | 总位数 | |
短浮点数 | 1 | 23 | 8 | 32 |
长浮点数 | 1 | 52 | 11 | 64 |
临时浮点数 | 1 | 64 | 5 | 80 |
以 68.78 = 0.6875 * 10^2 为例
位数(十进制) a:0.6875 阶码(十进制) n:2
阶码(二进制) n:000000010 存放形式: 符号位(1位) 位数部分(23位) 阶码部分(8位) 0 1011 0000 0000 0000 0000 0000 0000 0010
3.6、实型变量分类、定义和精度
- 单精度实型(float,4 byte,精确表示 7~8 个数字)
- 双精度实型(double(long float),8 byte,精确表示 16~17 个数字)
- 长双精度实型(long double,10 byte(VC 下占用 8 byte),精确表示 17~18 个数字)
实型默认按 double 类型处理
对于一个十进制实数,不一定能用二进制数精确表示
float a; double b, c; a = 123.456789; b = a; // 这时的 a 已经丢失了 123.456789 的精度,再赋值给 b 也不会还原,只有像下一行重新复制才行 c = 123.456789; printf("a=%f, b=%lf, c=%lf", a, b, c); // a=123.456787, b=123.456787, c=123.456789 结果中 a,b 最后一位是随机输出的
3.7、字符型数据和字符串常量
字符型(1 字节,8 位)数据就是整型数据,存放字符对应的 ASCII 码的值。
字符常量有两种表示形式:单引号括起来,使用转义字符(特殊的字符常量,以 \ 开头)。
C 语言字符集中任何一个字符均可用转义字符(\ddd,\xhh)表示。
转义字符 | 意义 | ASCII码值(十进制) |
---|---|---|
\a | 响铃(BEL) | 007 |
\b | 退格(BS) ,将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\\ | 代表一个反斜线字符''\' | 092 |
\' | 代表一个单引号(撇号)字符 | 039 |
\" | 代表一个双引号字符 | 034 |
\0 | 空字符(NULL) | 000 |
\ddd | 1~3 位八进制数所代表的任意字符,d(0~7) | 三位八进制 |
\xhh | 1~2 位十六进制所代表的任意字符,h(0~f) | 二位十六进制 |
使用转义字符时需要注意以下问题:
- 转义字符中只能使用小写字母,每个转义字符只能看作一个字符。
- \v 垂直制表和 \f 换页符对屏幕没有任何影响,但会影响打印机执行响应操作。
- 在 C 程序中,使用不可打印字符时,通常用转义字符表示。
- 转义字符 ’\0’ 表示空字符 NULL,它的值是 0。而字符 '0' 的 ASCII 码值是 48。因此,空字符 ’\0’ 不是字符 0。另外,空字符不等于空格字符,空格字符的 ASCII 码值为 32 而不是0。编程序时,读者应当区别清楚。
- 如果反斜线之后的字符和它不构成转义字符,则 ’\’ 不起转义作用将被忽略。
字符型变量可以参与运算,C 语言将字符型数据分为有符号字符和无符号字符。
字符串常量由一对双引号括起来,C 语言中没有字符串变量,用字符数组(char[])存的字符串。
字符串常量占的内存字节数等于字符串中字符个数加一,增加的一个字节存放 \0(ASCII 码为 0),这是字符串结束标志。
3.8、位运算
8:十进制 00000000000000000000000000001000:二进制 00000000000000000000000000001000:补码 00000000000000000000000000010000 << 1:左移 00000000000000000000000000000100 >> 1:右移 00000000000000000000000000000100 >>> 1:无符号右移 ------------------------------------------------------------------------ -8:十进制 10000000000000000000000000001000:二进制 11111111111111111111111111110111:符号位不变,其它位取反 11111111111111111111111111111000:最后加一即为负数的补码 11111111111111111111111111110000 << 1:左移 11111111111111111111111111111100 >> 1:右移 01111111111111111111111111111100 >>> 1:无符号右移 ------------------------------------------------------------------------ -2 补码:0xFFFE。会位移 0xFFFE(0xFFFFFFFE) mod 32 = 30位 -1 >>> -2 等价于 -1 >>> (32+(-2))=30 -1L >>> -2 等价于 -1L >>> (64+(-2))=62
(取值范围) https://blog.csdn.net/weixin_42856843/article/details/81989737
(数据类型) https://www.cnblogs.com/ricksteves/p/9899893.html
(数据类型) https://fishc.com.cn/thread-67055-1-1.html
(取值范围) https://fishc.com.cn/thread-67265-1-1.html
(转义字符) https://blog.csdn.net/ce123_zhouwei/article/details/9074121