《程序是怎样跑起来的》第二章——数据是用二进制数表示的?

关于第二章,主要讲了关于二进制方面的知识。

书上说大家都熟知计算机内部是由IC这种电子部件构成的,IC有不同的形状,带相同的是都有很多引脚,其实见过CPU的都知道CPU下部有着密密麻麻的针脚,IC的所有针脚都只有直流电压0V和0.5V两个状态,也就是说,一个针脚,只能表示两个状态。而这就决定了数据信息只能有二进制来处理(二进制不是专门为IC设计的,只是他们的特性非常契合),二进制的最小单位为bit(位),即二进制中的一位,而计算机处理数据的基本单位为字节(bite),一个字节等于8位。还有二进制如何转换为十进制,书中非常明了:

初步了解了什么是二进制后书中就讲解了关于二进制数的各种运算方法,移位运算、四则运算,还有什么是补数,逻辑右移和算术右移的区别、二进制数的逻辑运算。

移位运算分为向高位方向和向低位方向两种,一次可以进行多位的移位操作,并且不论程序中使用的几进制,计算机内部都会转换为二进制后进行移位运算,此外二进制的移位运算会导致二进制位溢出或空位,这时只需低位空位补零,溢出丢弃即可。这里有个神奇的点,高位空位怎么办呢?这就涉及到补数了,在二进制中表示负数是一般会把高位来当做符号位,0时表示正数,1时表示负数,这里书中有一个问题,我刚开始也想错了,-1的二进制数是多少呢?正确答案为11111111。确实让我没想到,我本认为是10000001。书中做了解释:计算机在做减法运算时,实际上内部再做加法运算,用加法运算来实现减法运算!所以在表示负数是要使用‘二进制的补数’,补数就是用正数来表示负数的,真令人新奇。而11111111这个结果这样得来的:为了获得补数对二进制数进行取反,将00000001取反后为11111110,再将取反的结果加1 就得来了11111111。所移补数求解的变换方法就是:取反+1。(法则:将二进制数的支取饭后+1的结果,和原来的值相加,结果为0)。

返回右移这个话题,逻辑右移是指将一个二进制数的所有位向右移动指定的位数,右侧空出的位用零填充。逻辑右移不考虑符号位,只对数值位进行移动。逻辑右移只是简单地将位向右移动,不关心数值的正负。如果要进行算术右移,需要考虑符号位的影响。只有在右移时候才必须分逻辑右移和算术右移。

补充:一、符号扩充:

符号扩充是一种在二进制数中进行符号位的扩展的操作。它通常用于将一个较短的有符号二进制数扩展为一个较长的有符号二进制数,以保持数值的符号不变。

符号扩充的过程是将原始有符号二进制数的符号位复制到更高位,使得新的二进制数在位数上与原始二进制数相同或更长。

例子假设我们有一个 4 位的有符号二进制数 1101,其中最高位是符号位,表示这是一个负数。现在我们要将其扩展为 8 位的有符号二进制数,扩展的过程如下:

  1. 复制符号位:将原始二进制数的最高位(即符号位)复制到新的二进制数的高位,得到 11111101。

  2. 填充数值位:由于原始二进制数只有 4 位,需要在低位填充 0,得到 11111101 00000000。

这样,我们就完成了将一个较短的有符号二进制数扩展为一个较长的有符号二进制数的过程。在进行运算时,可以使用这个扩展后的二进制数来保持符号不变并正确地参与运算

二、逻辑运算二进制中的逻辑运算有与(and)或(or)非(not)和异或(xor)四种,而逻辑运算java中早有接触。

 

posted @   琦q  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示