数据类型:数据的类型
数据有常量与变量之分,它们分别属于以上这些类型。
常量:程序运行过程中,其值不能被改变的量称为常量。
变量:在程序运行过程中 ,值可以变的 。
变量能变的原因:是个存储数据的内存空间
定义变量 --- 开辟了一块空间
int a = 10; //定义变量
//同时 给了一个值
//初始化
int a;
a = 10; //赋值
+---------+
| | 0x1000
+---------+
| | 0x1001//以字节 进行编号 ---地址 --编址
+---------+
| | 0x1002//以字节 进行编号 ---地址 --编址
+---------+
| | 0x1003 //以字节 进行编号 ---地址 --编址
+---------+
| | 0x1004//以字节 进行编号 ---地址 --编址
+---------+
| | 0x1005//以字节 进行编号 ---地址 --编址
+---------+
a. 数据类型大小
b. 10怎么放的?
字节序问题:
大端模式
小端模式: 高高低低
高位数据 高地址处 (编号大的)
低位数据 低地址处
int a = 0x12345678; //4个字节
+---------+ 大端存储
| 0x12 | 0x1000
+---------+
| 0x34 | 0x1001//以字节 进行编号 ---地址 --编址
+---------+
| 0x56 | 0x1002//以字节 进行编号 ---地址 --编址
+---------+
| 0x78 | 0x1003 //以字节 进行编号 ---地址 --编址
+---------+
| | 0x1004//以字节 进行编号 ---地址 --编址
+---------+
| | 0x1005//以字节 进行编号 ---地址 --编址
+---------+
+---------+ 小端存储
| 0x78 | 0x1000
+---------+
| 0x56 | 0x1001 //以字节 进行编号 ---地址 --编址
+---------+
| 0x34 | 0x1002 //以字节 进行编号 ---地址 --编址
+---------+
| 0x12 | 0x1003 //以字节 进行编号 ---地址 --编址
+---------+
| | 0x1004 //以字节 进行编号 ---地址 --编址
+---------+
| | 0x1005 //以字节 进行编号 ---地址 --编址
+---------+
进制问题
十进制:
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 ....
八进制:
0 1 2 3 4 5 6 7
10 11 12 13 14 15 16 17
20 ....
十六进制:
0 1 2 3 4 5 6 7 8 9 A B C D E F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
20 ....
二进制:
0 1
10 11
十进制 转 二进制
eg:
123
短除法 /除二取余法
百 十 个
1 2 3 = > 1 * 10^2 + 2*10^1 + 3 * 10 ^ 0
2|123
-----
2|61 ... 1 ---低位
---
2|30 ... 1
---
2|15 ... 0
---
2|7 ... 1
--
2|3 ... 1
--
2|1 ... 1 ---二进制 高位
--
0 .... 1
0111 1011
0111 1011 //二进制转十进制 --- 加权求和
总结:
十进制 转换 n进制: 除n取余法
n进制 转 十进制 : 加权求和
八进制 转二进制 :
1 个八进制数 对应 3位二进制数
01 111 011
1 7 3 //八进制
十六进制 二进制 :
1 个十六进制数 对应 4位二进制数
//
二进制权重:8421
0111 1011(二进制)
7 B (十六进制)
c语言:
int 4字节
short 2字节
long 8字节 //64位平台
long long 8字节
注:一个字节(1byte)对应八位(8bit)
unsigned / signed
unsigned //无符号 --非负数
signed //有符号 --负数
unsigned short
0000 0000 | 0000 0000 //统统都是数值位
signed short
0|000 0000 | 0000 0000
//最高位为 符号位
//其余 是数值位
unsigned short
0000 0000 | 0000 0000 //统统都是数值位 0
1111 1111 | 1111 1111 //最大数值
10000 0000 0000 0000 2^16 - 1 = 65536-1 //65535
unsigned short范围 [0,65535]
signed short
0|000 0000 | 0000 0000 //最小正值 0
0|111 1111 | 1111 1111 //最大正值 2^15 - 1 = 32767
1|000 0000 | 0000 0000 //补码
1|111 1111 | 1111 1111 //补码的 反码
1|000 0000 | 0000 0000 //原码 负的0 -2^15 = - 32768
1|111 1111 | 1111 1111 //补码
1|000 0000 0000 0000 //补码的 反码
1|000 0000 0000 0001 //原码 -1
signed short 范围: [-2^15 ~ 2^15-1]
-32768 32767
unsigned int
0000 0000 | 0000 0000 | 0000 0000 | 0000 0000 //最小值 0
1111 1111 | 1111 1111 | 1111 1111 | 1111 1111 //2^32 - 1
整型类型:
常量形式
123 --十进制
0123 --八进制
0x123 --十六进制
注:计算机中存储的都是 补码
正数:原 反 补 码都一样的
注:补码的补码是源码
对于有符号数据类型操作时,取反码时,符号位不取反。
负数补码: 反码 + 1 = 补码
eg:
负数
-123
原码
//short
1|000 0000 0111 1011 //负数的原码
1|111 1111 1000 0100 //负数的反码
1|111 1111 1000 0101 //负数的补码 ---计算机中
-----
F F 8 5 //十六进制表示
1|111 1111 1000 0101 //负数的补码
练习:
-6735 //int 型
printf("%#x\n",a);
手动计算:
-6735
1|000 0000 0000 0000 0001 1010 0100 1111 //原码
1|111 1111 1111 1111 1110 0101 1011 0000 //反码
1|111 1111 1111 1111 1110 0101 1011 0001 //补码
F F F F E 5 B 1
整型数据的溢出:
65535 ----
1111 1111 | 1111 1111 | 1111 1111 | 1111 1111 //放到计算机
---
|
%d //以有符号的十进制形式输出
|
V
1|111 1111 | 1111 1111 | 1111 1111 | 1111 1111
-----
求补码
1|000 0000 | 0000 0000 | 0000 0000 | 0000 0001 // -1
0 65535
xxx 65534
xxx 65533
... ...
32768
总结:
1.整型
常量形式
123
0123
0x123
变量定义
语法:
数据类型 变量名;
初始化
int a = 10;
赋值
int a;
a = 10;
2.整型大小
3.整型数据存储
字节序
整型数据本身的存放规则 --- 补码
正数 --原码 反码 补码 一样
负数 --反码 + 1
4.整型问题
整型溢出
浮点型:
1.浮点常量
1.234
1.23e4 //科学计数法形式
-1.23e-4 //-1.23 * 10^-4
1.23e4.3
2.浮点变量
float 4
double 8
3.大小
float 4
double 8
4.浮点数的存储
-9.25
首先,
step1.十进制的小数 转换为 二进制形式的小数
整数部分
9 --- 1001 //二进制整数部分
小数部分
0.25
乘二取整法
0.25 * 2 = 0.5 --- 0
0.5 * 2 = 1.0 --- 1
0.01 //二进制小数部分
综合:1001.01 //二进制形式的小数
step2.将二进制形式的小数写成二进制科学计数法形式
即 1.00101*2^3
eg:十进制科学计数法形式123.45 --> 1.2345 * 10 ^ 2
step3.按照 IEEE 754 标准 存放
float 32位
符号位| 指数位 |尾数位
1 | 8 | 23
1 | 3+127 | //127为偏置
1 |1000 0010|00101
|-127~128|
1111 1111 //255
1100 0001 0001 0100 0000 0000 0000 0000 //二进制形式
注:不够的尾数位用0补位
C 1 1 4 0 0 0 0 //十六进制形式
double 8个字节
符号位| 指数位 |尾数位
1 | 11 |52
练习:
-6.125
float f = -6.125;
printf("%#x\n",f);
step1:
0110.001
step2:
1.10001 * 2 ^ 2
0.125 * 2 = 0.25 --- 0
0.25 * 2 = 0.5 --- 0
0.5 * 2 = 1.0 --- 1
step3:
1100 0000 1100 0100 0000 0000 0000 0000
c 0 c 4 0 0 0 0
变量名命名规则及注意事项:
1.数字,字母,下划线组成
2.不能以数字开头
3.区分大小写
4.不能与关键词重名
5.不要与二级关键词重名 //include
6.不要与库函数重名