两个字节组成一个数时,先来的字节是高位还是低位,会改变数值。把每个字节内部的位倒过来,又是另一种操作,不能把它与交换两个字节混为一谈。
先明确输入与规则
本例把十六位无符号值拆成高字节和低字节。大端流按高低排列,小端流按低高排列;读取时分别按对应权重重组。另算逐字节位反转,以及整个十六位序列反转,作为不同变换的对照。
本例的独立记录
九个十六位模式独立解析,字节流用十六进制显示,变换结果和有符号解释用十进制显示。
原数 | 大端字节 | 小端字节 | 错序读取 | 每字节反位 | 整字反位 | 补码解释 0 | 00 00 | 00 00 | 0 | 0 | 0 | 0 65535 | FF FF | FF FF | 65535 | 65535 | 65535 | -1 60079 | EA AF | AF EA | 45034 | 22517 | 62807 | -5457 49775 | C2 6F | 6F C2 | 28610 | 17398 | 63043 | -15761 50648 | C5 D8 | D8 C5 | 55493 | 41755 | 7075 | -14888 20945 | 51 D1 | D1 51 | 53585 | 35467 | 35722 | 20945 43814 | AB 26 | 26 AB | 9899 | 54628 | 25813 | -21722 64499 | FB F3 | F3 FB | 62459 | 57295 | 53215 | -1037 57127 | DF 27 | 27 DF | 10207 | 64484 | 58619 | -8409
记录中的编号只用来区分本例对象,不应与大小排名或另一组记录的身份混淆。先核对单位和边界,再跟随中间值检查结果。空结果、零值与尚未确定是不同状态;分数保留精确含义,显示小数只为方便阅读。
怎样复算
使用正确字节序重组应回到原数。把大端流当小端读取等于交换字节权重,但不是自动反转每字节的八个位。完整十六位反转则同时改变字节位置和各字节内部位序。
先把每个字节写成恰好八位二进制,保留前导零再翻转。对反转结果再反转一次应回到原始模式,这是一个方便的检查。显示的十六进制文字只是数值表示,不能把文字字符顺序直接当作内存里的字节布局。
适用条件与限制
这里用一个明确的无符号整数模型;若同样的十六位模式按二进制补码解释为有符号值,大于等于三万二千七百六十八的值需减六万五千五百三十六。实际文件还可能有字段宽度与对齐约定,不能只猜字节序。
练习时可以一次只改变一个条件,比较差异从哪个步骤开始。若自己的结果不同,先核对是否采用同样的规则,再定位第一个不一致的中间状态,不要只修改最终答案。输入与运算过程需要一起保存,才能判断结论究竟适用于哪一个具体场景。
