目录
学习目标:
学习数据类型的原因?
1.方便编程解决现实问题
2.不同类型的数据可能导致最终使用的计算机硬件的差异
学习内容:
常量
在程序运行过程中,其值不能被改变的量称为常量。常量区分为不同的类型,如
整型常量
1 2 -3
实型常量
4.6 -1.23
实型常量也被称为浮点型常量。
字符常量
'a' 'b'
以上这些都可以称为字面常量或直接常量。除此之外,一个标识符也可以代表一个常量如,
#define PRICE 30
注:
符号常量的值在其作用域内不能改变,也不能再被赋值。如果再用赋值语句给PRICE赋值是错误的
变量
在程序运行过程中,其值能被改变的量称为变量。
变量由变量名和变量值组成
1.标识符的命名规则
C语言规定标识符只能由字母、数字和下划线3种字符组成且第一个字符必须为字母或下划线。编译系统将大写字母和小写字母认为是两个不同的字符。
注:
变量名不能与 c语言中的关键字,重名
变量名尽量,不要和c语言库函数重名
2.变量名使用规则
在C语言中,要求对所有用到的变量作强制定义,也就是“先定义,后使用”原则。
(1)凡未被事先定义的,系统不把它认作变量名,这能保证程序中变量名使用正确。
(2)每一个变量被指定为一个确定类型,在编译时就能为其分配相应的存储单元。
(3)指定每一变量属于一个类型,这就便于在编译时据此检查在程序中要求对该变量进行的运算是否合法。
3.变量的初始化和赋值
变量初始化的两种形式:
int a;//定义变量
a = 0;//变量赋值
或者
int a = 0;//定义变量的同时进行赋值
注:
变量不能重复定义
变量定义好,但是未初始化,此时变量对应的空间中,是一个随机值(垃圾值)
整型
1.整型常量
二,八,十,十六进制常量
八进制常量以0开头
十六进制常量以0x开头
进制转换
十进制 到 2进制 --- 除2取余法 (辗转相除法)
二进制 到 十进制 --- 加权求和
十进制 到 n进制 --- 除n取余法
n进制 到 十进制 --- 加权求和
八进制 <==> 二进制 1位八进制数 对应 3位二进制数
十六进制 <==> 二进制 1位十六进制数 对应 4位二进制数
2.整型变量
变量在计算机中的存储:
在内存上开一块空间,这块空间关联了一个 名字(变量名)
数据怎么存储到计算机?
字节序 (大小端)
小端:
高高低低 //高位数据 放在高地址处(地址编号大的)
大端:
高低高低
int a = 123;
123 -> 0111 1011
int a = -123;
有符号数 signed
无符号数 unsigned
int 型
0000 0000|0000 0000|0000 0000|0111 1011
有符号数:
最高位 0 表示正数
最高位 1 表示是个负数
0|000 0000|0000 0000|0000 0000|0111 1011
符号位|数值位
1|000 0000|0000 0000|0000 0000|0111 1011
计算机:
运算
1 - 123 //加法器
1 +(- 123)
补码
12 - 5 = 7
12 + (-5) = 7
12 + (12-5) = 19 % 12 => 7
12 + 补码
统一:
整数 存在计算机中 存的都是补码
正数的补码:
原码 反码 补码 一样的
123
原码 0000 0000|0000 0000|0000 0000| 0111 1011
反码 0000 0000|0000 0000|0000 0000| 0111 1011
补码 0000 0000|0000 0000|0000 0000| 0111 1011
负数的补码:
等于 反码 + 1 //符号不变
-123
原码:
1|000 0000|0000 0000|0000 0000| 0111 1011
反码: 符号位不变,数值位按位取反
1|111 1111|1111 1111|1111 1111| 1000 0100
补码: 反码+ 1
1|111 1111|1111 1111|1111 1111| 1000 0101
1111 1111|1111 1111|1111 1111| 1000 0101
f f f f f f 8 5
int a = -123;
|
|
存到计算机
|
V
[1111 1111|1111 1111|1111 1111| 1000 0101 ]
| |
%d %#x
| |
V V
-123 0xffffff85
数据存储的规则是固定的,但是因为不同的使用方式,到时对数据的解读不一样,则最终效果不一样
字符型
1.字符变量
举例
char c = 'A';
char c = 65;
char c = 0101;
char c = 0x41;
char c = '\101';
char c = '\x41';
2.字符常量
'a' //单个字符
3.字符类型大小
1 字节
4.字符数据的存储
是字符对应的ascii编码值,本质上其实还是整型数据 。char类型其实是一个 整型 (tiny int),char类型与整型是通用的 。
其存储格式由实作环境决定,arm-linux-gcc 规定 char 为 unsigned char型,vc 编译器、x86上的 gcc 规定 char 为 signed char。
5.ascii表
0~32 不可见字符 主要起到控制作用
33~127 可见字符
48~57 '0'~'9' //字符形式的0~9
65~90 'A'~'Z'
97~122 'a' ~ 'z'
浮点型
1.浮点型的变量
float //单精度类型 4 字节
double //双精度类型 8 字节
2.类型大小
printf("sizeof(float) = %ld\n",sizeof(float));
3.浮点型常量
1.23 //小数形式
1.23e3 //科学计数法的形式 1.23*10^3
1.23E3
1.23E-3
注意:
e 后面的 数字 ,可以是负数,但是不能是小数
4.浮点数存储
step1: 将十进制形式的小数,转换为二进制形式的小数
整数部分 ---- 辗转相除法 (除2取余法)
110
小数部分 --- 乘2取整法
0.125 * 2 = 0.25 ---- 0
0.25 * 2 = 0.5 ---- 0
0.5 * 2 = 1.0 ---- 1
二进制形式的小数:
110.001
step2:把二进制形式的小数 写成 科学计数法形式
110.001 --> 1.10001 * 2^2
step3: 按照 IEEE 754标准存储
float
符号位(1bits)|指数位(阶码位)(8bits)|尾数位 (23bits)
0 | +127偏移量 |
2 + 127
1000 0001 10001 不足的位 统统补 0
0100 0000 1100 0100 0000 0000 0000 0000
4 0 c 4 0 0 0 0
浮点数验证网站:
http://www.binaryconvert.com/result_float.html?decimal=045054046049050053
精确存储
8字节 64个位
符号位(1bits)|指数位(阶码位)(11bits)|尾数位 (52bits)
0 | +1023偏移量 |
1000 0001 10001 不足的位 统统补 0
注意:
1. double因为能存储的 尾数更多,所以精度更高
2. 代码中出现的常量 或者 变量,一定有其对应的数据类型
小数 默认识别为 double类型
3.浮点型数据比较,尽量是统一精度
4.可以显式的,指定常量的类型
0.9f //f表示 将0.9识别为 float类型
学习练习:
练习:
-12.625
0.625 * 2 = 1.25 --- 1
0.25 * 2 = 0.5 --- 0
0.5 * 2 = 1.0 --- 1
step1:
1100.101
step2:
1.100101 * 2 ^ 3
step3:
符号位| 指数 |
1 10000010 100101
1100 0001 0100 1010 0000 0000 0000 0000
c 1 4 a 0 0 0 0
练习:
0.9 存一个 0.9
0.9 * 2 = 1.8 --- 1
0.8 * 2 = 1.6 --- 1
0.6 * 2 = 1.2 --- 1
0.2 * 2 = 0.4 --- 0
0.4 * 2 = 0.8 --- 0
0.8 * 2 = 1.6 --- 1
练习:
0~9 //数值 0~9
数值 转换为 字符 // +48
// +'0'
练习:
'A' --> 'a' // 'A' + 32
'a' --> 'A' // 'a' - 32
练习:
定义5个char类型变量,分别给到 'h''e''l''l''o'
将 hello转换为大写输出
学习产出:
1、 int u=010,v=0x10,w=10; printf(“%d,%d,%d ”,u,v,w); 则输出结果是 8,16,10
定义八进制整型变量u,十六进制整型变量v,十进制整型变量w,并以%d形式输出。
已知0开头为八进制数,0x开头为十六进制数,10为十进制数
因此,将u,v,m统一为十进制数表示为010 ——>8 0x10 ——>16 10 ——>10
2、 程序Main() { unsigned int a=32768; printf(“a=%d ”,a); }的输出是 -32768 此题中int为 大小 2字节,16位
定义无符号整型变量a,以%d形式输出
已知16位下无符号整型取值范围是0到65536,%d以十进制整型输出(有符号),有符号情况16位下取值范围是-32768到32767.
因此赋值结果为32768,输出时出现上溢,最终结果为-32768
3、 程序 Main() {int k=11; printf(“k=%d,k=%o,k=%x ”,k,k,k);}的输出是 k=11,k=13,k=b
定义十进制整型变量k,以%d,%o,%x形式输出
已知%d为十进制整型输出,%o为八进制整型输出,%x为十六进制整型输出
因此,将k分别转化为十进制11 ——>11,八进制 11——>013,十六进制10 ——>0x0b
4.程序 short i=65535; printf ("%d ",i);的输出是 -1
定义short型变量i,并赋初值65535。最后以%d形式输出
已知short型变量大小为2字节16位,则short型取值范围是-32768到32767。
因此,赋值时出现上溢,i实际赋值= -1输出结果为-1.