- 一. 数据类型分类
- 二. 基本数据类型
- 1. 布尔型 bool
- 2. 字符型 char
- 3. short,long,long long类型
- 4. int类型
- 5. enum类型
- 三. 基本数据类型的常量
- 1. 整型常量
- 2. 浮点常量
- 3. 字符常量
- 4. 字符串常量
- 5. 标识常量
- 四. 变量
- 1. 变量的基础
- 2. 变量的声明与储存类型(auto, register, static, extern)
- 我们可以通过sizeof来确定字节长度
#includeint main(int argc, char *argv[]) { printf("%lu %lu %lu %lun", sizeof(_Bool), sizeof(char), sizeof(short), sizeof(int)); return 0; }
返回1 1 2 4
- 判断数字是否越界可以看limits.h这个头文件,可以在这个文件里看到每个数据类型的最大与最小取值
vi /usr/include/limits.h1. 布尔型 bool
其中对于布尔型需要引入头文件
#include2. 字符型 char#include int main(int argc, char *argv[]) { bool a, b, c; a = true; // true b = false // false c = -1; // true }
- char的取值范围及其编码
| 类型名称 | 长度(字节) | 值域 |
|---|---|---|
| char | 1 | -128 ~ 127 或 0 ~ 255 |
| signed char | 1 | -128 ~ 127 |
| unsigned char | 1 | 0 ~ 255 |
对signed char来说最高位位符号位0表示正,1表示负,对正数来说可以表述
2
7
−
1
2^7-1
27−1个数。
对负数来说先复习以下补码。计算机中负数用补码表示
| 数字 | 原码 | 反码 | 补码 |
|---|---|---|---|
| -1 | 10000001 | 11111110 | 11111111 |
| -127 | 11111111 | 10000000 | 1000001 |
| -128 | 1000000 |
- char是字符型但同时也能表示整数
#includeint main(int argc, char *argv[]) { char ch = 65; printf("ch=%d %cn", ch, ch); return 0; }
返回
ch=65 A
- 如果让ch=128超出了最大值127,其编码会是10000000也就是上表中的-128,因此会返回ch=-128
- 如果用unsigned,也就是unsigned char ch=-1超出了最小值0,其编码会是11111111也就是上表中的最大值255,因此会返回ch=255
| 类型名称 | 长度(字节) | 值域 |
|---|---|---|
| short (signed short) | 2 | -32768~32767 |
| unsigned short | 2 | 0~65535 |
| long | 4 | |
| long long | 8 |
| 类型名称 | 长度(字节) | 值域 |
|---|---|---|
| int (signed int) | 4 | -2147483648~2147483647 |
| unsigned int | 4 | 0~4294967295 |
#include5. enum类型int main(){ int a = 0x12345678; printf("%d %x %on", a, a, a) //打印十进制,十六进制,八进制 }
- 枚举的定义方法:
//1. 定义枚举类型的时候定义枚举变量
enum 枚举类型 {item1(=1), item2, ...} 枚举变量;
//2. 先定定义枚举类型,在定义枚举变量
enum 枚举类型
{
item1, item2, ...
};
enum 枚举类型 枚举变量;
//3. 省略枚举类型,直接定义枚举变量
enum {item1, item2, ...} 枚举变量;
- 举例,在这里给MON赋值1,TUE会自动被赋值2,以此类推。如果不赋值1,会被默认赋值0
#includeenum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN }; int main() { enum DAY day; day = WED; printf("%d",day); //3 return 0; }
- 遍历:在所有值都连续的情况下可以遍历
#includeenum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } day; int main() { // 遍历枚举元素 for (day = MON; day <= SUN; day++) { printf("枚举元素:%d n", day); } }
举一个不连续情况下的enum定义
enum DAY {MON, TUE=3, WED, THU, FRI, SAT, SUN}; //每个元素得到的值是 MON=1, TUE=3, WED=4, THU=5...
三. 基本数据类型的常量
常量指在程序运行期间其数值不发生变化的数据
1. 整型常量整数可以是十进制数、八进制数和十六进制数
- 八进制数:01234(八进制一个数代表3个二进制位)
- 十六进制数:0xd1c(十六进制一个数代表4个二进制位)
- 浮点常量又称为实数,一般含有小数部分
- 在C语言中,实数只有十进制的实数,分为单精度与双精度。
- 实数的表现方法有两种,即一般形式和指数形式
- 一般形式:1.1,1.2
- 指数形式:1.176e+10
可以结合Java-常亮与变量-学习笔记02来学习
3. 字符常量通常指单一字符,用单引号括起来。
一些规律
char a, b, c, d, e; int x; a = 'F'; //将70给a b = 'A'+2 // C c = ' ' + 'B' // b d = 'b' - 32 // B e = '0'; x = e-48 // 整数 04. 字符串常量
- 用双引号括起来。
- 字符串是以'0'结尾的
需要注意的是‘9'不等于"9"因为"9"隐含'0'。
char arr1[] = {"abc"};
char arr2[] = {'a', 'b', 'c', ' '}; // arr1 == arr2
5. 标识常量
#define <表示常量名称> <常量> #define PI 3.1415
通过下面的程序可以发现宏与正常的计算不同,宏是原样替代,而不是计算!
#include# define ONE 1 # define TWO ONE + ONE int main(int argc, char *argv[]) { int a = 10, b = 20, c; c = ONE + TWO * b + a; //计算结果是1+1+1*20+10=32 而不是 1+2*20+10=51 }
在终端输入
gcc -E define.c -o define.i
打开define.i,文件最后显示如下,可以看到c = 1 + 1 + 1 * b + a;
# 5 "deine.c"
int main(int argc, char *argv[])
{
int a = 10, b = 20, c;
c = 1 + 1 + 1 * b + a;
}
如果想算出 1 + 2 ∗ 20 + 10 = 51 1+2*20+10=51 1+2∗20+10=51这个结果需要做一些更改
#include四. 变量 1. 变量的基础# define ONE 1 # define TWO (ONE + ONE) //需要加括号 int main(int argc, char *argv[]) { int a = 10, b = 20, c; c = ONE + TWO * b + a; }
- 由字母、数字、下划线组成,不能以数字开头,不能和关键字重名
- 变量占据存储空间的大小由其数据类型决定
- 变量在内存空间中的首地址为变量的地址
- 变量说明的一般形式是:<存储类型> <数据类型> <变量名>
- 一般<存储类型>默认缺省,存储类型有四种
- auto:声明的是局部变量最常用(默认随机值)auto int i;与int i;一样
- register:寄存器型,申请将变量放入CPU的寄存器中,以加快程序运行速度,若申请不到同auto
- 必须是cpu能够接收的类型,比如说32位的计算机,大于32位的数据就存不了
- 不能用&取地址
- static:静态存储类型,可以是全局也可以是局部变量(全局变量默认为0)
- 在内存中以固定的地址存放,而不是以堆栈形式存放的
- 只要程序没有结束就不会随着程序段的结束二小时,下次调用还会保留上次调用结果
int i=1; while (i<5){ static int a; //默认为0 a++ printf("a=%dn", a); i++ }returna = 1 a = 2 a = 3 a = 4
- extern:当变量在一个文件中的函数体外说明,所有其他文件中的函数或程序段都可以引用这个变量
- 定义两个文件extern_static1.c和extern_static2.c。
- extern_static1.c
int global_a = 100;
exterm_static2.c#include
编译的时候需要将两个文件都放在一起用extern in global_a; //这里需要申明 int main(int argc, char *argv[]) { printf("global_a"=%dn", global_a); return 0; } gcc extern_static1.c extern_static2.c
- extern_static1.c,用了static再从外部调用就会报错
static int global_a = 100;



