数值、单位与位
同样的 ff 为什么是 255 或 -1?
使用工具
同一个字节在两份日志中分别为 255 和 −1,未必是损坏。FF 表示八位全为 1,却不能单独决定整数含义。固定位宽和符号条件,可区分数据改变与解读规则改变。
先按八位无符号解释
11111111 (binary)
ff (hexadecimal)
255 (unsigned decimal)选宽度 8、无符号、基数 16、OR,输入 FF 和 0。OR 0 保持位串,得到十进制 255、二进制 11111111、十六进制 ff。基数 10 时 FF 无效,输入进制也是解释条件。
八位无符号范围是 0~255,256 需九位。用整数范围工具检查宽度 8,可解释越界错误。把 255 理解为 2⁸−1,比记特殊数字更容易推广。
输入 −1,对比相同位串
255 − 256 = −1
11111111 → −1 (signed)
11111111 → 255 (unsigned)改为有符号、十进制,八位下输入 −1 OR 0。十进制为 −1,无符号值仍为 255,位串仍是 11111111。补码高位为 1 时,从无符号值减 2ʷ,即 255−256;不是负号加大小 127。
八位有符号接受 −128~127。十六进制 FF 作为数值是 255,因此默认拒绝策略下越界。截断可明确保留低位再解释,但那是单独操作,不是切换符号后自动发生。
FF 与 FFFF 的字段宽度不同
0000000011111111 = 255
1111111111111111 = −1 (signed 16-bit)
NOT 0, unsigned 8-bit → 255
NOT 0, unsigned 16-bit → 65535十六位有符号 00FF 高位为 0,仍是 255;−1 是 FFFF。扩大负数位宽需符号扩展,而非补零。协议中一字节或两字节会影响含义,不只是显示长度。
NOT 0 在宽度 8 得 255、宽度 16 得 65535。工具按所选宽度保留结果。与 JavaScript Number 等语言位运算比较时,也要统一其隐含位宽。大整数支持不能替代固定宽度规则。
负数右移要看空位如何填充
11111110 → 01111111 (logical) = 127
11111110 → 11111111 (arithmetic) = −1八位有符号 −2 右移一位,逻辑右移补 0 得 127,算术右移保留符号得 −1。只说右移就是除二会忽略差异。应先确定处理位串还是有符号算术。
不要用截断隐藏无效值
256 截为八位会留下 0,这是信息丢失,不是成功保留。拒绝策略用于阻止此情况。仅在格式明确要求回绕或低位时选择截断,不要调到结果看似合适为止。
记录原文 FF、基数 16、宽度 8 和符号条件;多字节还需按规范确认字节序。整数解释一致不证明字段边界和字节序正确。统一条件后仍不同,再比较实际提取数据。