找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2850

积分

0

好友

394

主题
发表于 12 小时前 | 查看: 0| 回复: 0

计算机是如何理解并处理数字和字符的?答案藏在最基础的二进制数之中。理解二进制,不仅是理解计算机的运作起点,也是深入计算机基础、编译原理乃至高性能编程的关键。

1 用二进制数表示计算机信息的原因

  • 计算机内部是由IC(集成电路)这种电子部件构成的。
  • IC有多种形状,一些像黑色蜈蚣,两侧排列着数个乃至数百个引脚。
  • 所有IC引脚,只有直流电压0V或5V这两种状态。也就是说,一个引脚只能表示两个状态,这完美对应了二进制中的0和1。

IC引脚与二进制表示

为了高效处理信息,计算机通常以8的倍数(如8位、16位、32位)组织二进制数,这是因为计算机信息处理的基本单位是8位二进制数,被称为一个字节(Byte)字节是最基本的信息计量单位(位是最小单位)。

规则一:高位补零
用字节单位处理数据时,如果数值的二进制位数小于存储空间的位数,高位就用0填补。

例如,100111这个6位二进制数,用8位(=1字节)表示时为00100111,用16位(=2字节)表示时为0000000000100111

因此,无论你用十进制还是文字编写程序,经过编译后,所有信息都会转换成二进制数值。程序运行时,计算机内部处理的始终是二进制流。

字符与数值的二进制转换

2 什么是二进制数

二进制数与我们熟悉的十进制数遵循相似的权重原理,只是基数从10变成了2。每一位的值是“数字 × 2^(位置)”,从右向左(从低位到高位)位置从0开始递增。

让我们以00100111为例,将其转换成十进制数来理解其机制:

二进制转十进制计算过程

计算过程为:(0×2⁷)+(0×2⁶)+(1×2⁵)+(0×2⁴)+(0×2³)+(1×2²)+(1×2¹)+(1×2⁰) = 0+0+32+0+0+4+2+1 = 39。

3 移位运算和乘除运算的关系

移位运算指的是将二进制数值的各个数位进行左移或右移的操作。移位操作是底层硬件和许多算法高效实现的关键。例如,在C/C++中,移位运算符直接对应CPU的快速位操作指令。

一次运算可以移动多个数位。

将变量a的值左移两位的C语言程序

a = 39;
b = a << 2;

移位运算本质上是针对二进制位的操作。无论源代码中使用几进制,计算机内部都会转换成二进制数进行处理。

十进制数39用8位二进制表示是00100111,左移两位后变成10011100(溢出的高位丢弃,空出的低位补0),再转换回十进制就是156。

二进制左移操作示意图

提示:十进制数左移一位相当于乘以10,左移两位乘以100。同理,二进制数左移n位,就相当于乘以2ⁿ;右移n位,则相当于除以2ⁿ(整数除法)。这使得乘除2的幂次方的运算在底层变得极其高效。

4 便于计算机处理的“补数”

4.1 二进制数如何表示负数

在二进制表示中,通常将最高位作为符号位:0表示正数,1表示负数

那么,-1用8位二进制如何表示?很多人直觉是10000001(将+1的00000001符号位改为1),但这是错误的。正确答案是11111111

为什么?因为计算机在设计上,希望用同一套加法电路来完成加法和减法运算。这就需要引入补数的概念来用加法实现减法。补数就是用正数来表示对应的负数

获取补数的方法就是“取反加一”

  1. 取反:将原二进制数的每一位取反(0变1,1变0)。
  2. 加一:在取反结果的基础上加1。

例如,求00000001(+1)的补数来表示-1:
二进制补码求解过程

4.2 计算机如何计算 1 + (-1)

我们都知道结果应该是0。如果用错误表示法(-1=10000001)计算:
00000001 + 10000001 = 10000010,结果显然不是0。
错误的负数表示导致运算错误

而用正确的补数表示(-1=11111111)计算:
00000001 + 11111111 = 1 00000000。最高位产生了进位溢出,计算机会直接忽略这个溢出的位,剩下的8位结果就是00000000,即0。
使用补码后运算结果正确

当然,其他运算,如3-5,也可以通过补数得到正确结果。需要注意的是,当运算结果为负数时,结果本身也是以补数的形式存储的

例如 3-53 = 000000115的补数(即-5)为 11111011
00000011 + 11111011 = 1 11111110。忽略溢出位,得到11111110,这正是-2的补数表示。
补码加法运算示例:3 + (-5)

5 逻辑右移和算术右移的区别

右移操作后,高位需要填充,根据填充规则的不同分为两种:

  • 逻辑右移:移位后,空出的高位一律补0。这通常用于处理无符号数或图形数据(如像素移位)。
    逻辑右移示意图
  • 算术右移:移位后,空出的高位用原符号位的值填充(符号位是0就补0,是1就补1)。这用于保持带符号整数的正负性,实现真正的除以2ⁿ。

简单说:逻辑右移高位补0;算术右移高位补符号位。
逻辑右移与算术右移规则说明

一个具体例子:将 -4(8位补码:11111100)右移两位。

  • 逻辑右移:结果为 00111111,即十进制63,这显然不是-4的1/4。
  • 算术右移:结果为 11111111,即补码表示的-1,这正是-4的1/4。
    逻辑右移与算术右移结果对比

符号扩充

当需要将较短位数的整数(如8位)转换为较长位数(如16位、32位)时,需要进行符号扩充。规则很简单:只需用原数的符号位填充所有新增的高位即可。这保证了数值在转换前后保持不变,无论是正数还是补码表示的负数。
符号扩充示意图

6 掌握逻辑运算的窍门

计算机运算主要分为算术运算(加减乘除)和逻辑运算。逻辑运算是直接对二进制位进行操作的运算,是逻辑门和条件判断的基础,主要包括以下四种:

  • 逻辑非(NOT):按位取反,0变1,1变0。
  • 逻辑与(AND):两个位都是1时,结果才为1。
  • 逻辑或(OR):两个位至少有一个是1时,结果为1。
  • 逻辑异或(XOR):两个位不相同时,结果为1(“相异为1”)。

这些运算在掩码操作、权限判断、加密和底层硬件控制中广泛应用。
逻辑运算真值表

理解从二进制表示、补码运算到位移与逻辑操作,是打开计算机系统黑盒的第一把钥匙。如果你对这类计算机基础原理的深度探讨感兴趣,欢迎在云栈社区与其他开发者交流切磋,共同探索技术的本质。




上一篇:OpenClaw AI助手Cloudflare部署教程:无服务器云原生实践指南
下一篇:公众号到数据库:一次资产测绘与弱口令引发的54家单位数据防线渗透实战
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-4 21:40 , Processed in 0.361003 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表