目录
一. 数据类型分类
二. 基本数据类型
- 我们可以通过
sizeof
来确定字节长度
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("%lu %lu %lu %lu\n", sizeof(_Bool), sizeof(char), sizeof(short), sizeof(int));
return 0;
}
返回1 1 2 4
- 判断数字是否越界可以看
limits.h
这个头文件,可以在这个文件里看到每个数据类型的最大与最小取值
vi /usr/include/limits.h
1. 布尔型 bool
其中对于布尔型需要引入头文件<stdbool.h>
,如果不想引用头文件可以用_Bool
作为基本类型,但缺点是true
和false
没有被定义。这被定义在头文件<stdbool.h>
内。
#include <stdio.h>
#include <stdbool.h>
int main(int argc, char *argv[])
{
bool a, b, c;
a = true; // true
b = false // false
c = -1; // true
}
2. 字符型 char
- 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是字符型但同时也能表示整数
#include <stdio.h>
int main(int argc, char *argv[])
{
char ch = 65;
printf("ch=%d %c\n", ch, ch);
return 0;
}
返回
ch=65 A
- 如果让
ch=128
超出了最大值127,其编码会是10000000
也就是上表中的-128,因此会返回ch=-128
- 如果用unsigned,也就是
unsigned char ch=-1
超出了最小值0,其编码会是11111111
也就是上表中的最大值255,因此会返回ch=255
3. short,long,long long类型
类型名称 | 长度(字节) | 值域 |
---|---|---|
short (signed short) | 2 | -32768~32767 |
unsigned short | 2 | 0~65535 |
long | 4 | |
long long | 8 |
4. int类型
类型名称 | 长度(字节) | 值域 |
---|---|---|
int (signed int) | 4 | -2147483648~2147483647 |
unsigned int | 4 | 0~4294967295 |
#include <stdio.h>
int main(){
int a = 0x12345678;
printf("%d %x %o\n", a, a, a) //打印十进制,十六进制,八进制
}
5. enum类型
- 枚举的定义方法:
//1. 定义枚举类型的时候定义枚举变量
enum 枚举类型 {item1(=1), item2, ...} 枚举变量;
//2. 先定定义枚举类型,在定义枚举变量
enum 枚举类型
{
item1, item2, ...
};
enum 枚举类型 枚举变量;
//3. 省略枚举类型,直接定义枚举变量
enum {item1, item2, ...} 枚举变量;
- 举例,在这里给
MON
赋值1
,TUE
会自动被赋值2
,以此类推。如果不赋值1
,会被默认赋值0
#include <stdio.h>
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
int main()
{
enum DAY day;
day = WED;
printf("%d",day); //3
return 0;
}
- 遍历:在所有值都连续的情况下可以遍历
#include <stdio.h>
enum 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个二进制位)
2. 浮点常量
- 浮点常量又称为实数,一般含有小数部分
- 在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 // 整数 0
4. 字符串常量
- 用双引号括起来。
char *p = "string";
- 字符串是以
'\0'
结尾的
需要注意的是‘9'
不等于'9'
因为"9"
隐含'\0'
。
char arr1[] = {"abc"};
char arr2[] = {'a', 'b', 'c', '\0'}; // arr1 == arr2
5. 标识常量
#define <表示常量名称> <常量>
#define PI 3.1415
通过下面的程序可以发现宏与正常的计算不同,宏是原样替代,而不是计算!
#include <stdio.h>
# 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 <stdio.h>
# 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. 变量的基础
- 由字母、数字、下划线组成,不能以数字开头,不能和关键字重名
- 变量占据存储空间的大小由其数据类型决定
- 变量在内存空间中的首地址为变量的地址
2. 变量的声明与储存类型(auto, register, static, extern)
- 变量说明的一般形式是:
<存储类型> <数据类型> <变量名>
- 一般
<存储类型>
默认缺省,存储类型有四种- auto:声明的是局部变量最常用(默认随机值)
auto int i;
与int i;
一样 - register:寄存器型,申请将变量放入CPU的寄存器中,以加快程序运行速度,若申请不到同auto
- 必须是cpu能够接收的类型,比如说32位的计算机,大于32位的数据就存不了
- 不能用
&
取地址
- static:静态存储类型,可以是全局也可以是局部变量(全局变量默认为0)
- 在内存中以固定的地址存放,而不是以堆栈形式存放的
- 只要程序没有结束就不会随着程序段的结束而消失,下次调用还会保留上次调用结果
returnint i=1; while (i<5){ static int a; //默认为0 a++ printf("a=%d\n", a); i++ }
a = 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 <stdio.h> extern in global_a; //这里需要申明 int main(int argc, char *argv[]) { printf("global_a"=%d\n", global_a); return 0; }
如果我们把gcc extern_static1.c extern_static2.c
extern_static1.c
修改一下,在变量声明前加了static
后再从外部调用就会报错static int global_a = 100;
- auto:声明的是局部变量最常用(默认随机值)