数据类型
编译器预算变量(对象)分配的内存空间大小
关键字
C关键字共有32个
-
数据类型关键字(12个)
char, short, int, long, float, double,
unsigned, signed
struct, union, enum,
void
-
控制语句关键字(12个)
if, else, switch, case, default,
for, do, while, break, continue, goto, return
-
存储类关键字(5个)
auto, extern, register, static, const
-
其他(3个)
sizeof, typedef, volatile
常量与变量
-
常量:在程序运行过程中,其值不会改变
-
变量:在程序运行过程中,其值可以改变
-
在使用前必须先定义,必须指定其数据类型
-
标识符命名规则
- 标识符不能为保留关键字
- 标识符由字母、数字、下划线组成
- 只能以字母或下划线开头
- 标识符区别大小写
-
变量初始化:定义的同时赋初值
-
变量特点
- 变量在编译时分配相应的内存空间
- 可以通过其变量名或者地址访问相应的内存空间
-
声明和定义的区别
-
声明变量不需要建立存储空间,eg:extern int a;
-
定义变量需要建立存储空间,eg:int a;
#include <stdio.h> int mian() { //extern 只做声明,不能做任何定义 //声明变量a,没有建立存储空间 extern int a; a = 10; //error:undefined reference to `a',没有空间无法赋值 //const修饰一个变量为只读,相当于常量 const int b = 10; b =20; //error: assignment of read-only variable ‘b’ int c = b; //ok return 0; }
-
-
-
eg:
#include <stdio.h> #define PI 3.14 int main() { float r, s; printf("Please input r:"); scanf("%f", &r); s = PI*r*r; printf("this square is %.2f\n", s); return 0; }
进制
-
右边是低位,左边是高位
进制(逢x进1,接1当x) 表示 二进制 0, 1 十进制 0, 1, 2, 3, 4 ,5, 6, 7 八进制 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 十六进制 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F -
8421法
1111 = 2 3 ∗ 1 + 2 2 ∗ 1 + 2 1 ∗ 1 + 2 0 ∗ 1 = 8 ∗ 1 + 4 ∗ 1 + 2 ∗ 1 + 1 ∗ 1 = 15 = F 1 1 1 1 = 2^3*1 + 2^2*1 + 2^1*1 + 2^0*1 =8*1 + 4*1 + 2*1 + 1*1 =15 =F 1111=23∗1+22∗1+21∗1+20∗1=8∗1+4∗1+2∗1+1∗1=15=F -
进制转换
- 1位八进制数 = 3位二进制数
- 1位十六进制数 = 4位二进制数
- 八进制转十六进制,先转换为二进制数
-
C语言中进制表示
进制 表示 二进制 C语言不能直接写二进制数 八进制 以数字0开头,0~7 十进制 以数字1-9开头,0~9 十六进制 以0x / 0X开头,09和AF -
eg:
#include <stdio.h> int main() { int a, b, c; a = 123; b = 0123; c = 0x123; printf("[10]%d\n[8]%o\n[16]%x\n", a, b, c); return 0; }
原反补码
- 数据在计算机中主要以补码形式存储
术语 | 含义 |
---|---|
bit(比特,位) | 一个二进制数(0/1)表示一位,数据传输以“位”为单位 |
Byte(字节) | 一个字节为8个二进制数(8位),计算机中存储最小单位位字节,数据存储习惯以“字节”为单位 |
WORD(双字节,字) | 2个字节,16位 |
DWORD | 两个WORD,4个字节,32位 |
1 b | 1 bit,1位 |
1 B | 1 Byte,1字节,8位 |
1 k,1 K | 1024 |
1 M(1兆) | 1024 k,1024*1024 |
1 G | 1024 M |
1 T | 1024 G |
1 Kb(千位) | 1024 bit,1024位 |
1 KB(千字节) | 1024 Byte,1024字节 |
1 Mb(兆位) | 1024 Kb = 1024*1024 bit |
1 MB(兆字节) | 1024 KB = 1024*1024 Byte |
-
存储1字节(8位)大小的数字(char)
- 原码(用户角度):原始的二进制
- 用户的数字分正负数,利用符号位
- 最高位(左起第一位)为符号数:0代表正数,1代表负数
- 导致的问题
- 0有两种存储方式
- 正数和负数相加,结果不正确(计算机只会加法运算)
- 反码(为了算补码)
- 规定:正数的原码和反码一致,负数符号位不变,其他位取反(01互换)
- 导致的问题
- 0有两种存储方式
- 补码(为了存储负数)
- 规定:正数的原码、反码和补码一致,负数为其补码+1
- 解决的问题
- 统一0的存储编码
- 符号位和其他位统一处理
- 减法运算转变为加法运算
- 两个用补码表示的数相加,最高位(符号位)有进位则被舍去
- 补码求原码:
- 正数补码等于其原码
- 负数符号位不变,其他按位取反,结果+1
- 原码(用户角度):原始的二进制
-
eg:
数字 原码 反码 补码 + 1 0 000 0001 0 000 0001 0 000 0001 - 1 1 000 0001 1 111 1110 1 111 1111 + 0 0 000 0000 0 000 0000 0 000 0000 - 0 1 000 0000 1 111 1111 1 0 000 0000(最高位丢弃) 1 - 1 = 1 + -1 1 000 0010 = -2 1 111 1111 = -0 1 0 000 0000 = -0 = 0
有符号和无符号的区别
-
有符号数,最高位是符号位,1代表负数,0代表整数
-
无符号数,最高位不是符号位,是数的一部分,不包含负数
-
-0当作2^x使用(最高位舍去)
数据类型 占用空间 取值范围 char 1字节 -128127(-2^72^7-1) short 2字节 -3276832767(-2^152^15-1) int 4字节 -21474836482147483647(-2^312^31-1) long 4字节 -21474836482147483647(-2^312^31-1) unsigned char 1字节 0255(02^8-1) unsigned short 2字节 065535(02^16-1) unsigned int 4字节 04294967295(02^32-1) unsigned long 4字节 04294967295(02^32-1) -
eg:
#include <stdio.h> int main() { char a = 0xff; //[signed] char unsigned char b = 0xff; //原:1 111 1111 反:1 000 0000 补:1 000 0001 printf("signed char:%d\n", a); //-1 //原:1 111 1111 反:1 111 1111 补:1 111 1111 printf("unsigned char:%u\n", b); //255,输出结果以格式控制符为准 return 0; }
-
赋值或者运算,不要越界
#include <stdio.h> int main() { char a = 127 + 2; //129 //补码:1 000 0001 取反 //反码:1 111 1110 +1 //原码:1 111 1111 -127 printf("%d\n", a); //-127 unsigned char b = 255 + 2; //257 //补码:1 0 000 0001 取反(只取后8位) //反码:1 0 000 0001 //原码:1 0 000 0001 //warning: large integer implicitly truncated to unsigned type [-Woverflow] //隐式截断为无符号类型的大整数 printf("%u\n", b); //1 return 0; }
sizeof关键字
-
sizeof不是函数,不用包含头文件,作用为计算一个数据类型的大小,单位为字节
-
sizeof返回值位size_t,size_t在32位操作系统试下是unsigned int(无符号整型)
-
eg:
#include <stdio.h> int main() { float a; double b; printf("char:%ld\nint:%ld\n", sizeof(char), sizeof(int)); //1 4 printf("float:%ld\ndouble:%ld\n", sizeof(a), sizeof(b)); //4 8 int len = sizeof(a); print("%d", len); //4 return 0; }
整型:int
-
整型变量的输入和输出
格式控制字符 含义 %o 一个八进制的int类型数 %x 一个十六进制的int类型数,输出字母小写 %X 一个十六进制的int类型数,输出字母大写 %u 一个无符号的十进制的int类型数 %hu 一个无符号的十进制的short类型数 %lu 一个无符号的十进制的long类型数 %llu 一个无符号的十进制的long long类型数 %d 一个有符号的十进制的int类型数 %hd 一个有符号的十进制的short类型数 %ld 一个有符号的十进制的long类型数 %lld 一个有符号的十进制的long long类型数 -
eg:
#include <stdio.h> int main() { short a; int b; long c; long long d; printf("Please input a, b, c, d:"); scanf("%hd%d%ld%lld", &a, &b, &c, &d); printf("%hd, %u, %o, %x, %X\n", a, a, a, a, a); printf("%d, %u, %o, %x, %X\n", b, b, b, b, b); printf("%ld, %lu, %lo, %lx, %lX\n", c, c, c, c, c); printf("%lld, %llu, %llo, %llx, %llX\n", d, d, d, d, d); return 0; }
-
几种整型比较
数据类型 占用空间 short(短整型) 2个字节 int(整型) 4个字节 long(长整型) windows为4个字节,linux 32位位4个字节,linux 64位为8个字节 long long(长长整型) 8个字节
字符型:char
-
字符型变量的输入和输出
数据类型 占用空间 char 1个字节 格式控制字符 含义 %c 一个char类型字符 -
内存中没有字符,只有数字,一个数字对应一个ASCII码
man ascii //linux 查看ASCII表
-
定义时单引号只包含一个字符(转义字符除外),用数字或者字符赋值等价
-
字符类型本质上为1个字节大小的整型
-
小写字母比大写字母大32
-
-
eg:
#include <stdio.h> int main() { char a = 97; char b = 'a'; printf("a=%c,b=%c\n", a, b); //a a printf("a=%d,b=%d\n", a, b); //97 97 char c = 'a'; char d = 'A'; printf("a=%d,A=%d\n", c, d); //97 65 return 0; }
转义字符
-
由反斜杠\组成的多个字符
转义字符 含义 ASCII码 \a 警报 007 \b 退格(BS),将当前位置移到前一列 008 \f 换页(FF),将当前位置移到下一页开头 012 \n 换行(LF),将当前位置移到下一行开头 010 \r 回车(CR),将当前位置移到本行开头 013 \t 水平制表(HT),跳到下一个TAB位置 009 \v 垂直制表(VT) 011 \\ 代表 \ 092 \’ 代表 ’ 039 \" 代表 " 034 ? 代表 ? 063 \0 s数字 0 000 \ddd 八进制转义字符,d范围0~7 3位八进制数 \xhh s十六进制转义字符,h范围09、af、A~F 2位十六进制数
实型(浮点型):float、double
-
浮点型变量的输入和输出
数据类型 占用空间 有效数字范围 float 4个字节 7位有效数字 double 8个字节 15~16位有效数字 格式控制字符 含义 %f 一个float单精度浮点型数 %lf 一个double双精度浮点型数 - float存储不准确
-
eg:
#include <stdio.h> int main() { float a = 100.9f; printf("%f\n", a); //100.900002 double b; printf("Please input b:"); scanf("%lf", &b); //3.14 printf("%lf\n", b); //3.140000 return 0; }
类型限定符
限定符 | 含义 |
---|---|
extern | 声明一个变量,extern声明的变量没有建立存储空间 |
const | 定义一个常量,值不可修改 |
volatile | 防止编码器优化代码 |
register | 定义寄存器变量,提高效率,register建议型指令,如果CPU有空闲寄存器则生效 |