详解计算机内部存储数据的形式 二进制数

详解计算机内部存储数据的形式—二进制数
前言
要想对程序的运行机制形成一个大致印象,就要了解信息(数据)在计算机内部是以怎样的形式来表现的,又是以怎样的方法进行运算的。在 C 和 Java 等高级语言编写的
程序中,数值、字符串和图像等信息在计算机内部都是以二进制数值的形式来表现的。也就是说,只要掌握了使用二进制数来表示信息的方法及其运算机制,也就自然能够了解程序的运行机制了。那么,为什么计算机处理的信息要用二进制数来表示呢?

一、用二进制数表示计算机信息的原因
计算机内部是由  IC(集成电路( Integrated Circuit) )这种电子部件构成的。 CPU( 微处理器) 和内存也是 IC 的一种。IC 有几种不同的形状,有的像一条黑色蜈蚣, 在其两侧有数个乃至数百个引脚; 有的则像插花用的针盘, 引脚在 IC 内部并排排列着。== IC 的所有引脚, 只有直流电压0V 或 5VB 两个状态==。 也就是说, IC 的一个引脚, 只能表示两个状态。IC 的这个特性, 决定了计算机的信息数据只能用二进制数来处理。

计算机处理信息的最小单位——位, 就相当于二进制中的一位。 位的英文 bit 是二进制数位( binary digit) 的缩写。
8 位二进制数被称为一个字节
位是最小单位,字节是==(信息的)基本单位==。
用字节单位处理数据时, 如果数字小于存储数据的字节数(二进制数的位数), 那么高位上就用 0 填补。 例如, 100111 这个 6 位二进制数, 用 8 位( =1 字节) 表示时为 00100111, 用 16 位( = 2 字节) 表示时为 0000000000100111。
二、什么是二进制数
二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”
二进制数的值转换成十进制数的值, 只需将二进制数的各数位的值和位权相乘,
然后将相乘的结果相加即可。例如00100111转为十进制数是39

为什么这样计算呢?其实二进制和十进制的思想是一致的,比如十进制数39=(3 x 101) +(9 x 100),其中幂函数中10是基数, 这里和各个数位的数值相乘的 10 和
1, 就是位权。二进制和十进制计算方式就是基数不同而已。
三、移位运算和乘除运算的关系
移位运算指的是将二进制数值的各数位进行左右移位( shift = 移位) 的运算。 移位有左移( 向高位方向)和右移( 向低位方向) 两种。 在一次运算中, 可以进行多个数位的移位操作。
<< 这个运算符表示左移, 右移时使用 >> 运算符。 << 运算符和 >> 运算符的左侧是被移位的值, 右侧表示要移位的位数。
左移后空出来的低位要进行补0 操作
移位操作使最高位或最低位溢出的数字, 直接丢弃就可以了。例如十进制数 39 用 8 位的二进制表示是 00100111, 左移两位后是 10011100, 再转换成十进制数就是 156。 

移位运算也可以通过数位移动来代替乘法运算和除法运算。左移两位后数值变成
了原来的 4 倍。 十进制数左移后会变成原来的 10 倍、 100 倍、 1000 倍……同样,二进制数左移后就会变成原来的 2 倍、 4 倍、 8倍 …… 反之, 二进制数右移后则会变成原来的1/2、1/4、1/8…
四、表示负数的“补数”
二进制数中表示负数值时, 一般会把最高位作为符号来使用, 因此我们把这个最高位称为符号位。符号位是 0 时表示正数 , 符号位是1 时表示负数。
那么-1 用 8 位二进制数来表示的话是什么样的呢? 可能很多人会认为“1 的二进制数是 00000001, 因此-1 就是 10000001”,但这个答案是错的, 正确答案是 11111111。
计算机在做减法运算时, 实际上内部是在做加法运算。 用加法运算来实现减法运算, 为此, 在表示负数时就需要使用“二进制的补数”。补数就是用正数来表示负数。
补数如何获得? 只需要将二进制数的各数位的数值全部取反 ,然后再将结果加 1
用 8 位二进制数表示- 1 时, 只需求得 1,也就是 00000001 的补数即可。 具体来说, 就是将各数位的 0 取反成 1,1 取反成 0, 然后再将取反的结果加 1, 最后就转化成了 11111111

那么,对于一个补数,如何知道它所代表的负数值是多少呢?这时我们可以利用负负得正这个性质。补数代表一个负数,那么补数的补数代表一个正数,这个正数取负就是这个补数的值。如 11111110,最高位是1,因此代表一个负数,11111110取反再加1为00000010。 这个是 2 的十进制数。 因此,11111110 表示的就是-2。
五、逻辑右移和算术右移的区别
当二进制数的值表示图形模式而非数值时,== 移位后需要在最高位补 0==。 类似于霓虹灯往右滚动的效果。 这就称为逻辑右移

将二进制数作为带符号的数值进行运算时, 移位后要在最高位填充移位前符号位的值( 0 或 1)。 这就称为算术右移。即如果数值是用补数表示的负数值, 那么右移后在空出来的最高位补 1, 就可以正确地实现 1/2、 1/4、 1/8 等的数值运算。 如果是正数, 只需在最高位补 0即可。

只有在右移时才必须区分逻辑位移和算术位移。 左移时, 无论是图形模式( 逻辑左移) 还是相乘运算( 算术左移), 都只需在空出来的低位补 0 即可。

符号扩充就是指在保持值不变的前提下将其转换成 16 位和 32 位的二进制数。

符号扩充的方法:不管是正数还是用补数表示的负数, 都只需用符号位的值( 0 或者 1) 填充高位即可。如01111111 这个正的 8 位二进制数转换成 16 位二进制数是 0000000001111111 ; 11111111这个用补数表示的负数转换成 16 位二进制数是1111111111111111

在运算中, 与逻辑相对的术语是算术。 我们不妨这样考虑, 将二进制数表示的信息作为四则运算的数值来处理就是算术。 而像图形模式那样, 将数值处理为单纯的 0和 1 的罗列就是逻辑。

算术运算是指加减乘除四则运算。

逻辑运算是指对二进制数各数字位的 0 和 1分别进行处理的运算, 包括逻辑非( NOT 运算)、 逻辑与( AND 运算)、 逻辑或( OR 运算) 和逻辑异或( XOR 运算 A) 四种。

逻辑非指的是 0 变成 1、 1 变成 0 的取反操作。

逻辑与指的是“两个都是 1” 时, 运算结果为 1, 其他情况下运算结果都为 0 的运算

逻辑或指的是“至少有一方是 1” 时, 运算结果为 1, 其他情况下运算结果都是 0 的运算。

逻辑异或指的是排斥相同数值的运算。“两个数值不同”, 也就是说, 当“其中一方是 1, 另一方是 0” 时运算结果是 1, 其他情况下结果都是 0。

逻辑真值表如下:

猜你喜欢

转载自blog.csdn.net/feng8403000/article/details/114905170