进制与进制转换
----------------------进制---------------------------
进制:进位的制度
十进制: 逢十进一(出现十个数字后进一)
十六进制:逢十六进一(出现十六个数字后进一)
八进制: 逢八进一(出现八个数字后进一)
eg:
十进制:
0 1 2 3 4 5 6 7 8 9
10 11 12 13 .... 19
20 21 ... 29
...
十六进制: // 10 11 12 13 14 15
0 1 2 3 4 5 6 7 8 9 a b c d e f
10 11 12 ... 1a 1b ... 1f
20 ...
...
八进制:
0 1 2 3 4 5 6 7
10 11 12 13 ... 17
20 21 ...
...
二进制:
0 1
10 11
100 101 110 111
1000 ...
...
------------------------进制转换------------------------
十进制 转 二进制
除2取余法
2|123
----
2|61 ... 1 ----低位
--
2|30 ... 1
---
2|15 ... 0
---
2|7 ... 1
--
2|3 ... 1
--
2|1 ... 1
--
0 ... 1 ---高位
0111 1011
二进制转十进制:
法一:加权求和(对应数字的大小乘以权重后相加)
法二:8421BCD码(只是适应于位数小于等于四位的二进制转换为十进制)
法一eg:
1 0 1 1 --> 1*2^3+0*2^2+1*2^1+1*2^0 = 11
法二eg:
1 0 1 1 --> 1*8+0*4+1*2+1*1 = 11
二进制转十六进制:
原理:1位十六进制数 对应4位二进制数
eg:0111 1011
7 b
二进制转八进制:
原理:1位八进制数 对应3位二进制数
eg:001 111 011
1 7 3
常量与变量
常量 :在程序运行过程中,值不能被改变的量
变量:在程序运行过程中,值能被改变的量
基本数据类型(整型、浮点型、字符型)
整形的相关知识
-----------------------整型--------------------------
1、整形的三种常量形式:
123 //十进制
0x123 //十六进制
0123 //八进制
2、变量形式:数据类型 + 变量名
变量名起名:
1.数字,字母,下划线
2.数字不是开头
3.区分大小写
4.不能与关键字重名
5.不要和系统二级关键词重名 (include 预处理的命令)
6.不能与库函数重名
数据类型:
short // 在内存中占2个字节空间
int // 在内存中占4个字节空间
long // 在内存中占4个字节空间
long long // 在内存中占8个字节空间
signed / unsigned //(有符号 / 无符号)以上几种类型都可加这两这之一做前缀,不写默认是有符号
有符号数:
二进制位中最高位为符号位
包含了 正数 负数
无符号数:
二进制位种不包含符号位
包含非负数
eg:
int a; // 先开空间 后给值
a = 10; // 赋值
int a = 10; //初始化 开空间的同时给了值
3、 整形数据存储
a.字节序 (大端、小端)
大端存储:
高位数据 存储在 低地址处
低位数据 存储在 高地址处
小端存储:
高位数据 存储在 高地址处
低位数据 存储在 低地址处
口诀(高高低低)
eg:
int a = 0x12345678; //从左到右数据位由高到低
b.数值的存储(不论正数还是负数在计算机里边都存储的是二进制补码的形式)
正数:原码,反码,补码相同
负数:原码除符号位外按位取反为反码,反码加1为补码
eg:
0000 0000 0000 0000 0001 0110 0010 1110 //5678(原码反码补码三码相同)
0 0 0 0 1 6 2 e //十六进制
1000 0000 0000 0000 0001 0110 0010 1110 //-5678 (原码)
1111 1111 1111 1111 1110 1001 1101 0001 //-5678 (反码)
1111 1111 1111 1111 1110 1001 1101 0010 //-5678 (补码)
f f f f e 9 d 2 //十六进制
负数知道补码求原码的两种方法:
法一:补码减一为反码,反码除符号位外按位取反即为原码
法二:补码除符号位外按位取反的到反码,反码加1即为原码
eg:
法一:
1111 1111 1111 1111 1110 1001 1101 0010 //-5678 (补码)
1111 1111 1111 1111 1110 1001 1101 0001 //-5678 (反码)
1000 0000 0000 0000 0001 0110 0010 1110 //-5678 (原码)
法二:
1111 1111 1111 1111 1110 1001 1101 0010 //-5678 (补码)
1000 0000 0000 0000 0001 0110 0010 1101 //-5678 (反码)
1000 0000 0000 0000 0001 0110 0010 1110 //-5678 (原码)
c.数据类型大小(能表示的十进制的最大最小值)
unsigned int (无符号整形) --> [0 ~ 2^32 -1]
0000 0000 0000 0000 0000 0000 0000 0000 //最小值 --> 0
1111 1111 1111 1111 1111 1111 1111 1111 //最大值 --> 2^32 - 1 //42亿多
最大值的计算过程:
1111 1111 1111 1111 1111 1111 1111 1111
+ 1
---------------------------------------
1 0000 0000 0000 0000 0000 0000 0000 0000 //2^32 - 1 //42亿多
signed int (有符号整形) --> [-2^31 ~ +2^31-1]
正数:
0|000 0000 0000 0000 0000 0000 0000 0000 //正数的最小值 0
0|111 1111 1111 1111 1111 1111 1111 1111 //正数的最大值 2 ^ 31 - 1 //21亿多
负数:
1|000 0000 0000 0000 0000 0000 0000 0000 //负数的最小值 -2,147,483,648
1|111 1111 1111 1111 1111 1111 1111 1111 //负数的最大值 -1
推到过程:
1|000 0000 0000 0000 0000 0000 0000 0000 //某个负数的补码
1|000 0000 0000 0000 0000 0000 0000 0000 //负数
//负的0,不能这样写,C语言做了以下规定
//规定 符号位 既充当符号位又当数值位,short long long long,在这块的算法一样
//所以这块的十进制的值为 -2,147,483,648
1|111 1111 1111 1111 1111 1111 1111 1111 //某个负数的补码
1|000 0000 0000 0000 0000 0000 0000 0001 //-1
同理有一下结论:
unsigned short(无符号短整型) --> [0~2^16-1] //65536-1
signed short (有符号短整型) --> [-2^15 ~ +2^15-1] //-32768 ~ 32767
整型的溢出(以unsigned short类型为例 )
上溢出:一个unsigned short类型,最大存储 1111 1111 1111 1111 ,此时在加1,会将多余的高位溢出
整型的溢出:(上溢出)
1111 1111 1111 1111
+ 1
------------------------------
1 0000 0000 0000 0000
溢出1,剩余 0000 0000 0000 0000 ---> 0
unsigned short i = 0;
for (i = 0; i <= 65536; ++i)
{
printf("i = %d\n",i); //重复打印0 ~ 65535
}
下溢出:一个short类型,最小存储 0000 0000 0000 0000,此时在减1,将会有以下结果
整型的溢出:(下溢出)
0000 0000 0000 0000
- 1
--------------------------------
1 1111 1111 1111 1111
unsigned short i = 0;
i = i - 1;
printf("i = %d\n",i); //打印结果 65535
可用下图来形象类比:上溢出逆时针走到下个数字,下溢出顺时针走到下个数字
浮点型的相关知识
----------------------------浮点型---------------------------------
1.常量形式
1.234
1.2e3 //科学计数法形式 //1.2*10^3
1.2E3 //e后面 可以是正数 或 负数 不能是小数,e用大小写都行
2.变量形式:数据类型 + 变量名
变量名起名:
1.数字,字母,下划线
2.数字不是开头
3.区分大小写
4.不能与关键字重名
5.不要和系统二级关键词重名 (include 预处理的命令)
6.不能与库函数重名
数据类型:
float //单精度 4个字节
double //双精度 8个字节
3.数据存储
单精度存储:
符号位|指数位|尾数位
1位 | 8 位|23位
+127
6.25
step1: 将小数 转换为 二进制形式的小数
整数部分: (除2取余法)
0110
小数部分:(乘2取整法)
0.25 * 2 = 0.5 --- 0
0.5 * 2 = 1 --- 1
乘到无小数
// ----> 注意永远是小数部分乘2
//
// eg: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
组合:
0110.01
step2:将二进制形式的小数,写成科学计数法形式
1234.56 ---> 1.23456*10^3 //以十进制为例
110.01 ---> 1.1001 * 2^2 //科学计数法形式
step3:按照 IEEE 754 标准 存放
1位 符号位|8位-指数位|尾数位
| |
0 | 2 + 127 |
| -127~128 |
0 1000 0001 1001 0000 0000 0000 0000
0100 0000 1100 1000 0000 0000 0000 0000
4 0 c 8 0 0 0 0
练习:
-12.25 ----> 注意只有整形才存在反补码转换,浮点型不论正负数,统一都是按上述步骤操作
1100.01
1.10001 * 2 ^ 3
1|3+127|
1100 0001 0100 0100 0000 0000 0000 0000
c 1 4 4 0 0 0 0
双精度存储:
符号位|指数位|尾数位
1位 | 11位|52位
+1023
步骤同上
4、浮点型数据类型的大小:
因为任意精度浮点型足够大,所以一般可以随意用,不区分大小
5、浮点数的比较问题(精度问题),统一精度
------------------------------------------------------------------------
下列代码执行结果为 no
float f = 0.9;
if (f == 0.9)
{
printf("yes");
}
else
{
printf("no");
}
原因:
浮点常量的类型: 默认识别为double类型,这里f是float类型,==后边的0.9是double类型,所以是 no
-------------------------------------------------------------------------
--------------------------------------------------------------------------
下列代码执行结果为 yes
float f = 0.9;
if (f == 0.9f)
{
printf("yes");
}
else
{
printf("no");
}
原因:
0.9f //表示识别为 float类型
-------------------------------------------------------------------------
进而还有:0.9L //L表示long double
整型常量:
说明类型
123L //long int
123LL //long long int
123UL //unsigned long int
----------------------------------
字符型的相关知识
-------------------------------字符型----------------------------------
ASCII编码表与编码:
计算机只能存储0或1,字符要存储到计算机中需要对其进行编码,进而将其编码后的结果存入计算机中
我们可以在ASCII码表中找到常用字符的编码
eg:
a ---> 编码值 (数值) ---> 无符号的整数
常量形式:
'a' //字符常量
ASCII码中的其他字符
变量形式:
char ch; //tiny int(小整形) 这句话的意思就是说在电脑看来char型数据其实就是int型数据
signed ch
unsigned ch
eg:char可以与int混用
char ch1 = 'h';
char ch2 = 'e';
char ch3 = 'l';
char ch4 = 'o';
printf("%c%c%c%c%c\n",ch1-32,ch2-32,ch3-32,ch3-32,ch4-32); //大小写转换 加减32
//大写加32可转换为小写
数据类型的大小:
unsigned char [0~2^8-1] //255
signed char [-128~127]
多个字符:
'abc' 相当于由多个字符的ASCII值组合起来(不是加)的数值
eg:
printf("%#x %c\n",'abc','abc'); //0x616263 c
printf("%#x %c",'abcd','abcd'); //0x61626364 d,因为是%#x,所以最多单引号里边四个字符
ascii表:
0~32 控制字符 不可见,但是有效果,例如没有字符可以表示空格,但是按空格会出现效果
'0'~'9' //48~57
'A'~'Z' //65~90
'a'~'z' //97~122
'0' //字符0,不是int的0
练习
char c = '0';
printf("%d", c); //获得字符0的十进制编码(48)
int a = 0;
printf("%c", a + 48); //已知整形0,打印字符‘0’
int a = 97;
printf("%c",a); //打印ASCII码值为97的字符