本篇首先讨论恰好10位的无符号二进制表示。实际编程语言的数据类型可能使用8、16、32位或其他宽度;有符号编码也必须另行说明。
1024种状态怎样对应0到1023
每一位可以是0或1,十个位共有2¹⁰=1024种排列。把这些排列解释为无符号整数时,最小排列0000000000₂表示0,最大排列1111111111₂表示1023。整数区间包含端点,所以从0到1023的数量是1023−0+1=1024。把最大值误写成1024,就等于给同样的十个位多安排了一种状态。
从位权相加看最大值
十位的位权分别是1、2、4、8、16、32、64、128、256、512。全部取1时相加得到1023,也就是2¹⁰−1。这个结果可用递推验证:九个1表示511,在左侧增加一个位权512的1便得到1023。表示数值1024需要再增加第十一位,写成10000000000₂;它已超出原先十位的容器。
有符号范围需要先指定编码
若规定使用10位二进制补码,范围是−512到511,仍然恰好包含1024个整数。它将一部分状态用于负数,没有凭空增加总状态数。不要只看到“10位整数”就宣布最大值1023;题目若没写无符号还是补码,信息仍不完整。十位小数显示框也不等于十个二进制位,两者基数不同。
可执行检查单
- 01先写清位数、基数以及是否无符号,避免把不同编码混在同一张表里。
- 02计算状态数量2¹⁰,再按从0起计数得到最大无符号值2¹⁰−1。
- 03分别试算0、1023、1024三个边界,判断哪些值需要拒绝或使用更宽表示。
一个常见问题
1023加1后一定会变成0吗?
不能脱离实现给出统一结论。若明确设计为只保留低10位并按模1024运算,结果才是0;某些程序会先把数值提升到更宽类型,得到1024,也可能主动报错或限制在最大值。解释结果前应查看类型与溢出规则,不能把纸上的固定宽度模型当成所有语言的默认行为。
把边界用于输入检查
设练习要求输入一个十位无符号数值,那么允许区间是0≤x≤1023,并且x必须为整数。只检查x<1024会漏掉负数和小数;只检查十进制字符长度也无效,因为1024和1023同为四个字符。把条件拆为“整数”“不小于0”“不大于1023”,每条都有对应的反例,检查才完整。