计算机基础常识:软件开发新手五大核心技能排行(二)
摘要
计算机采用二进制因物理上易实现两种稳定状态,且布尔代数对应逻辑电路。二进制与十进
第二章 二进制与数据编码 —— 计算机的语言
计算机为什么要用二进制?这其实是个挺实在的问题——不是因为它“高级”,而是因为物理上最容易实现两种稳定状态:高电平与低电平、充电与放电、磁化方向的正反。再加上布尔代数天然对应逻辑电路,抗干扰能力还强,二进制就成了那个最优解。
2.1 为什么计算机使用二进制?
二进制转十进制,原理很简单:每一位的权重是2的幂次。比如二进制 1011.01 等于 1×2³ + 0×2² + 1×2¹ + 1×2⁰ + 0×2⁻¹ + 1×2⁻² = 8 + 0 + 2 + 1 + 0 + 0.25 = 11.25。
十进制转二进制呢?整数部分用“除2取余”,从下往上读。举个例子,13除以2得6余1,6除以2得3余0,3除以2得1余1,1除以2得0余1,结果就是 1101。
代码实现也不复杂:
# 任意进制转换
def decimal_to_binary(n):
if n == 0: return "0"
result = ""
while n > 0:
result = str(n % 2) + result
n //= 2
return result
print(decimal_to_binary(13)) # "1101"
print(bin(13)) # "0b1101"
# 十进制转十六进制
print(hex(255)) # "0xff"
print(hex(42)) # "0x2a"
2.2 原码、反码、补码 —— 整数的二进制表示
计算机里表示有符号整数,用的是补码。为什么?因为补码能把减法统一成加法,硬件实现省事多了。
以8位有符号整数为例:
5 原码: 0000 0101
-5 原码: 1000 0101
5 反码: 0000 0101
-5 反码: 1111 1010
5 补码: 0000 0101
-5 补码: 1111 1011 (反码+1)
验证加法:5 + (-5) = 0000 0101 + 1111 1011 = 1 0000 0000 → 丢弃进位,得 0000 0000
为什么8位补码能表示-128?补码范围是-128~127,-128的补码是 1000 0000,而127是 0111 1111。注意,-128没有对应的原码和反码,这是补码特有的。
用Ja va演示补码加法:
public class ComplementDemo {
public static void main(String[] args) {
byte a = 127;
byte b = 1;
byte c = (byte)(a + b); // 溢出
System.out.println(c); // -128
int x = 5, y = -3;
System.out.printf("%d + %d = %d", x, y, x + y);
System.out.println(Integer.toBinaryString(5)); // 101
System.out.println(Integer.toBinaryString(-3)); // 11111111111111111111111111111101
}
}
2.3 浮点数的 IEEE 754 标准
浮点数在计算机里是不精确的——用有限的二进制位数表示无限小数,这事儿注定有误差。
单精度(32位)布局:
符号位(1) | 指数位(8) | 尾数位(23)
S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM
计算公式:(-1)^S × 1.M × 2^(E-127)
最经典的精度丢失例子:
# 0.1 的二进制是无限循环 0.0001100110011...
print(0.1 + 0.2) # 0.30000000000000004
# 用 Decimal 避免
from decimal import Decimal, getcontext
getcontext().prec = 50
print(Decimal('0.1') + Decimal('0.2')) # 0.3
# 浮点数比较的正确方式
def float_equal(a, b, epsilon=1e-10):
return abs(a - b) < epsilon
print(float_equal(0.1 + 0.2, 0.3)) # True
2.4 字符编码 —— 从 ASCII 到 Unicode
ASCII(美国信息交换标准代码)用7位表示128个字符(0~127),包括英文字母、数字、标点和控制字符。演示一下:
for code in range(65, 91):
print(f"{code}: {chr(code)}")
# 65:A, 66:B, ...
中文字符编码的演进很有意思:
- GB2312:中国国家标准,包含6763个汉字
- GBK:扩展版,包含21003个汉字
- Big5:繁体中文常用
- Unicode:统一所有字符,每个字符有唯一码点(如U+4E2D是“中”)
- UTF-8:变长编码,兼容ASCII,是互联网最流行的实现
UTF-8的编码规则:

乱码的根源通常是编码和解码方式不一致。看个例子:
text = "你好,世界"
# 用 UTF-8 编码
utf8_bytes = text.encode('utf-8')
print(utf8_bytes) # b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c'
# 错误地用 GBK 解码 → 乱码
garbled = utf8_bytes.decode('gbk', errors='ignore')
print(garbled) # 输出乱码: "浣犲ソ锛屼笘鐣"
# 正确解码
correct = utf8_bytes.decode('utf-8')
print(correct) # 你好,世界 来源:互联网
本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。