一、进制转化
- 下面链接说明了各个进制整数的转化
二、八、十、十六进制间转化 - 这里补充一下浮点数的转换
- 转换规则:小数部分乘以2取整,一直循环,直到小数部分为0,将每次计算的整数部分顺序排列即可。
- 下面看下具体的例子(数字左下角的标号表示该数是以什么进制表示,没有标识的默认为十进制)。
- 十进制浮点数-0.5, 0.5 ∗ 2 = 1.0 0.5*2 = 1.0 0.5∗2=1.0,乘积结果整数部分为1,小数部分为0,所以它的转化一步到位,最终二进制结果是 − 0. 1 2 -0.1_2 −0.12
- 十进制浮点数5.9375,首先转换整数部分
5
10
5_{10}
510,转换成二进制是
10
1
2
101_2
1012。然后看小数部分,
0.9375
∗
2
=
1.875
,
0.875
∗
2
=
1.75
,
0.75
∗
2
=
1.5
,
0.5
∗
2
=
1.0
0.9375*2 = 1.875, 0.875*2 = 1.75, 0.75*2 = 1.5, 0.5*2 = 1.0
0.9375∗2=1.875,0.875∗2=1.75,0.75∗2=1.5,0.5∗2=1.0。
所以他的最终结果是把每次计算结果的整数部分顺序排列为 0.11 1 2 0.111_2 0.1112, 最终结果为 101.11 1 2 101.111_2 101.1112 - 十进制数3.1875,首先整数部分 3 10 3_{10} 310 = 1 1 2 11_2 112,然后看小数部分 0.1875 ∗ 2 = 0.375 , 0.375 ∗ 2 = 0.75 , 0.75 ∗ 2 = 1.5 , 0.5 ∗ 2 = 1.0 0.1875*2=0.375, 0.375*2 = 0.75, 0.75*2 =1.5, 0.5*2 = 1.0 0.1875∗2=0.375,0.375∗2=0.75,0.75∗2=1.5,0.5∗2=1.0, 每次计算结果的整数部分顺序排列为 0.001 1 2 0.0011_2 0.00112,最终结果为 3.187 5 10 = 11.001 1 2 3.1875_{10} = 11.0011_2 3.187510=11.00112
- 特别说明一下,上面例子中的数都是我刻意选出来的,刚好能够用二进制形式准确的表示,事实上很多浮点数无法在计算机中准确的存储,只能是无限接近。下面这个链接是一个人家写好的进制转换计算器,可以玩一下:在线进制转换计算器
二、数据存储
①数值的原码表示
- 在这之前,先来了解一下数据的存储形式:计算机中数据是以二进制的形式存储的。8个二进制位(bit)组成一个字节(byte),连续的两个字节构成了一个字(word)。这八个二进制位最左端的称为最高位,最右端的称为最低位。
- 数值的原码是指,最高位用作符号位(0表示整数。1表示负数),其余各位代表数值本身的绝对值(以二进制表示)的表示形式。列如+9原码是00001001、-9是10001001、其中符号位上的0表示正,1表示负。
②数值的反码表示
数值的反码表示分两种情况:
- 正数的反码与原码相同,如+9的反码是00001001。
- 负数的反码符号位为1,其余各位为该数绝对值的原码按位取反(1变0,0变1),列如,因为-9是负数,则其反码符号位为1;其余7位为-9的绝对值+9的原码0001001按位取反为1110110,所以-9的反码是11110110。
③、数值的补码表示
数值的补码表示也分为两种情况:
- 正数的补码与原码相同,列如+9的补码是00001001。
- 负数的补码符号位为1,其余位为该数绝对值的原码按位取反,然后整个数加1。列如因为-9是负数,则符号位为1;其余7位为-9的绝对值+9的原码0001001按位取反为1110110;再加一,所以-9的补码是11110111。
已知一个数的补码,求原码的操作分两种情况:
- 如果补码的符号位为0,表示一个正数,所以补码就是该数的原码。
- 如果补码的符号位为1,表示一个负数,求原码的操作可以是符号位不变,其余各位取反,然后在整个数加1。
列如,已知一个补码为11111001,则原码是10000111(-7),计算过程就是按上述方法一一展开。
在计算机系统中,数值一律用补码表示,这是因为,使用补码可以将符号位和其它位统一处理,同时减法也可以按加法来处理,另外两个用补码表示的数相加时,如果最高位有进位,则进位被舍弃。
三、位运算
简介:
运算符 | 含义 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 取反 |
<< | 左移 |
>> | 右移 |
- 上述六种位运算中,其中按位取反是单目运算符,其余都是双目运算符。
- 位运算的运算对象只能是整形(int,short,long,unsigned)或字符型数据,而不能是实形数据,%求余也只能是整形或字符型。
下面分别介绍:
①按位与&
参与运算的两个数取二进制,然后将对应的各二进制位进行与(&)运算。按位相与的运算与“逻辑与”相类似,只有两个二进制位都为1时才为1, 有一个为0时,则为0。
“按位与”常用来将一个数的某些位清零,或者保留某些位, 将数据与另一个数做按位与运算, 要保留的位,在这个数中,对应的位取1, 要清零的对应位取0。
for example:
9&5运算得1;代码验证:
#include <stdio.h>
int main()
{
printf("%d", 9&5);
return 0;
}
运算结果:
深度解析:
9&5具体运算过程如下:
00001001
&00001001
--------------------
00000001
所以。
送福利了