1. 计算机中的正数与负数表示
在计算机系统中,数字的存储方式与我们日常使用的十进制表示有着本质区别。所有数据最终都以二进制形式存在,而正负数的区分则需要特殊的编码方案。
1.1 原码:正数的标准表示
对于正整数,计算机采用最直观的"原码"表示法。以数字5为例:
- 十进制:5
- 二进制原码:00000101(假设使用8位存储)
这里最高位(最左边)是符号位,0表示正数,后面7位是数值部分。这种表示简单直接,但存在一个重大问题:它无法优雅地处理负数运算。
注意:原码表示中,0有两种形式(+0和-0),这在计算机运算中会造成不必要的复杂性。
1.2 补码:负数的智慧解决方案
负数在计算机中以补码形式存储,这种设计解决了原码的多个缺陷。让我们以-5为例:
- 先写出5的原码:00000101
- 取反码:11111010(所有位取反)
- 加1得到补码:11111011
补码表示有三大优势:
- 统一了0的表示(只有00000000)
- 减法可以转换为加法运算
- 符号位参与运算,无需特殊处理
在8位系统中,补码能表示的范围是-128(10000000)到127(01111111)。这种表示法被所有现代计算机采用,因为它简化了CPU的算术逻辑单元(ALU)设计。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 位运算深度解析
位运算直接操作二进制位,是底层编程中的重要工具。理解它们对优化算法、处理硬件交互等场景至关重要。
2.1 右移运算(>>)
右移运算符将二进制数整体向右移动指定位数,左侧补入的值取决于具体类型:
- 逻辑右移:左侧补0(适用于无符号数)
- 算术右移:左侧补符号位(保持有符号数的符号)
以8位数5(00000101)右移2位为例:
code复制原数:00000101 (5)
右移:00000001 (1) // 右侧的01被移出
对于负数-5(11111011)算术右移2位:
code复制原数:11111011 (-5)
右移:11111110 (-2) // 左侧补符号位1
实用技巧:右移n位相当于整数除以2^n并向下取整,但效率远高于除法运算。
2.2 左移运算(<<)
左移运算符将二进制数向左移动指定位数,右侧补0。需要注意的是:
- 左移可能改变符号位,导致正负变化
