1(1)进制的定义 和类型
进制是一种计数的方式,数值的表达类型。 同一整数至少有四种表达方式: 十进制, 二进制 八进制 十六进制。
(2 )进制的特点
二进制 特点 只有 0 和 1 ,逢2进1,书写格式以0b或者0b开头,使用场合:二进制指令\二进制文件,变量在内存中就是二进制存储。
八进制 特点:0~7,逢八进一,书写格式以0开头,
十六进制 特点:0~F,逢十六进一 0x或者0X开头。
十进制 特点:整数形式 逢十进一。
(3)
进制在printf中的输出形式
%d\%i 十进制形式输出整数
%c 输出字符
%p 输出地址
%f 输出小数
%o 八进制形式输出整数
%x 十六进制形式输出整数
2 进制的转换问题
进制转换的3个基本要素:数位、基数和位权
数位: 数位是指数码在一个数中所处的位置
基数:每个数位上所能使用的数码的个数 (二进制取值0、1基数为2,十进制取值0-9基数为10
位权:位权是指一个固定值 如367 3*10^2 6*10^1 7*10^0
(1)十进制转二进制
67 = 64 + 2 + 1 = 2的6次方 + 2的1次方 + 2的0次方
= 0b1000000 + 0b10 + 0b1
= 0b1000011
(2)2进制--->10进制
0b1100 = 0 * 2的0次方 + 0 * 2的1次方 + 1 * 2的2次方+ 1 * 2的3次方
= 0 + 0 + 4 + 8 = 12
0b1111 = 1 + 2 + 4 + 8 = 15
0b1010 = 10
(3)2进制--->8进制
整数部分 从高位 三位并一位,,小数部分 从左到右三位并一位,合算成数字,从右到左 以此写出
(4) 8进制--->10进制
八进制数采用 0~7这八数来表达一个数。 八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方......
(5)8进制--->2进制
从高位以此一拆为三,依次写出
(6)2进制--->16进制
整数部位从右到左四位并一位,小数部分 从左到右四位并一位。
一 )原码、反码、补码
默认数是10进制
原码
正数:数转换为2进制,最高位如果是0,则是整数
负数:数转换为2进制,最高位如果是1,则是负数
00000001 +1
10000001 -1
反码
正数:整数的反码还是它的原码
负数:除符号位不变,其它各位,逐位取反
00000001 +1 反码
11111110 -1 反码
+ 00000001
补码
补码主要是用于设计计算机的减法
正数:整数的补码还是它的原码
负数:反码+1
技巧
已知负数的原码求补码
1)反码:除符号位之外,取反
2)补码:反码+1
-10
原码:10000000 00000000 00000000 00001010
反码:11111111 11111111 11111111 11110101
+1 00000000 00000000 00000000 00000001
----------------------------------------------
补码:11111111 11111111 11111111 11110110
用补码得到原码:
10000000 00000000 00000000 00001001
+1 00000000 00000000 00000000 00000001
------------------------------------------------
10000000 00000000 00000000 00001010
例如 -13原码: 10000000 00000000 00000000 00001101
-13反码: 11111111 11111111 11111111 11110010
13补码: 11111111 11111111 11111111 11110011
位运算:
C语言中的位运算符介绍:
一个数的二进制机器码之间的运算 是一个双目运算,需要有两个操作数
1)& 按位与 (比较两个数对应的数码,如果都为1,则结果为1)
口诀:同1为1
9&5
1001
& 0101
------------
0001 (1)
2)| 按位或(比较两个数对应的数码,如果有一个为1,则结果为1)
口诀:有1为1
1001
| 0101
---------------
1101 (13)
3)^ 按位异或(比较两个数对应的数码,如果两个码相同则为0,不同则结果为1)
口诀:相同为0,不同为1
1001
^ 0101
--------------
1100 (12)
4)~ 按位取反(单目运算,数码逐位取反)
口诀:0变1,1变0
00000000 00000000 00000000 00001001
~
-----------------
11111111 11111111 11111111 11110110 (-10)
5)>> 按位右移
表示所有的二进制位,整体右移n位
注意:
1)数值得变化:每向右移动1位相当于除以2,保留整数部分
2)右移的时候,高位补符号位,低位直接舍弃
3)向右移动的时候,不会改变一个数的正负性
000000000 00000000 00000000 00001001
|
6)<< 按位左移
表示:所有的二进制位,都向左移动
00000000000 00000000 00000000 01001000 =72
|
11001111 11111111 11111111 11110110
|
左移:
1)左移可以让一个数变大
左移1次相当于*2
2)左移可能会改变一个数的正负性
3)高位舍弃,低位补0
技巧:
1)任何数和1进行按位与(&) 的到这个数的低位
1001
& 0001
-----------
0001 1
1000
& 0001
-----------
0000 0
技巧 任何二进制数与一进行按位与 运算 能判断奇偶性。
变量的存储:
查看变量的地址使用 %p
1)内存是由若干个1个字节的存储单元组成
每个单元都有一个唯一的地址
2)内存存储数据是从高地址向地地址分配的
数据有高位和地位
int a =10;
00000000 00000000 00000001 00001010
高 低
一个整数的各个字节存放的顺序:地位存放低地址 高位存放高地址
3)变量在内存中最小的那个地址,是变量的首地址
类型说明符
int 4个字节 %d
short 2个字节 %d
long 8个字节 %ld
long long 8个字节 %lld
signed和unsigned的区别:
signed 最高位要当做符号位
unsigned 最高位不要当做符号位
signed == signed int
signed 有符号:正数、0、负数
char型常量
占一个字节 存储原理 去除字符的ASCII码值,然后转换成二进制,储存在一个字节中
注意事项 当把一个字符赋值给一个char类型变量,那么系统首先查这个字符所对应的ASCII码,然后把
这个ASCII值放到变量中 ,根据变量中存储的ASCII值,去查ASCII表中对应字符,然后把这个字符打印控制台上,整形和 字符型可 以互相转换。
技巧 小写字母和对应的大写字母相差32,
|
|