ZHCADY9 April   2024 LM73 , LM75B , LM95071 , TMP100 , TMP101 , TMP102 , TMP103 , TMP104 , TMP107 , TMP1075 , TMP108 , TMP112 , TMP114 , TMP116 , TMP117 , TMP121 , TMP122 , TMP123 , TMP124 , TMP126 , TMP144 , TMP175 , TMP1826 , TMP1827 , TMP275 , TMP400 , TMP401 , TMP411 , TMP421 , TMP422 , TMP423 , TMP431 , TMP432 , TMP435 , TMP451 , TMP461 , TMP464 , TMP468 , TMP4718 , TMP75 , TMP75B , TMP75C

 

  1.   1
  2.   摘要
  3.   商标
  4. 1引言
    1. 1.1 二进制补码
      1. 1.1.1 二进制补码特征
    2. 1.2 Q 格式
    3. 1.3 常见温度数据格式
    4. 1.4 高精度温度数据格式
  5. 2代码示例
    1. 2.1  16 位(采用 Q7 表示法)
      1. 2.1.1 属性
      2. 2.1.2 C 代码
    2. 2.2  12 位(采用 Q4 表示法)
      1. 2.2.1 属性
      2. 2.2.2 C 代码
    3. 2.3  13 位(采用 Q4 表示法)(EM=1)
      1. 2.3.1 属性
      2. 2.3.2 C 代码
    4. 2.4  13 位(采用 Q4 表示法)
      1. 2.4.1 属性
      2. 2.4.2 C 代码
    5. 2.5  14 位(采用 Q6 表示法)
      1. 2.5.1 属性
      2. 2.5.2 C 代码
    6. 2.6  TMP182x 格式
      1. 2.6.1 属性
      2. 2.6.2 C 代码
    7. 2.7  14 位(采用 Q5 表示法)
      1. 2.7.1 属性
      2. 2.7.2 C 代码
    8. 2.8  8 位(无 Q 表示法)
      1. 2.8.1 属性
      2. 2.8.2 C 代码
    9. 2.9  11 位(采用 Q3 表示法)
      1. 2.9.1 属性
      2. 2.9.2 C 代码
    10. 2.10 不采用二进制补码的器件
      1. 2.10.1 属性
      2. 2.10.2 C 代码
  6. 3其他编程语言
    1. 3.1 解析
    2. 3.2 二进制补码
    3. 3.3 丢弃未使用的位
    4. 3.4 应用 Q 格式
  7. 4总结
  8. 5参考资料
  9. 6附录:Q 应用源代码
  10. 7附录:器件概要表

二进制补码

  • 在支持显式类型转换的编程语言中,在转换为正确的数据类型时会自动处理二进制补码。
/* C Type Casting */
unsigned char x = 0xFF;
signed char y = x;
signed int z = (signed char) x;
/* x is 255 but both y and z are -1 */

/* C99 fixed width integer types */
uint8_t x = 0xFF;
int8_t y = x;
int8_t z = (int8_t) x;
/* x is 255 but both y and z are -1 */
  • 如果不进行类型转换,则需要使用 IF 语句来检测并更正应为负数的数字。
    • 对于 n 位的二进制补码数,大于或等于 2(n-1) 的值实际上是负数。换句话说,如果存在 2(n-1) 位,则该数为负数。该位也称为符号位。对于 8 位数字,符号位等于 0x80 或 0b10000000。
    • 要解码负值,请减去 2n。这是为了将二进制补码负值的顺序颠倒过来。另请参阅表 1-1

      • 反之也成立:当将负数编码为有符号二进制数据类型时,可以加上 2n 来获得正确的十六进制/二进制值。
      • 请注意,这种加上或减去 2n 的方式假定基础数据类型不会溢出。在大多数情况下,这是一个安全的假设,因为如果我们可以将数据类型强制转换为正确的位数,就不需要通过这种方来更正数据的符号。底层数据类型可能是 C 浮点数或类似类型,至少为 32 位。
    • 在 Excel 中,为了提高可读性,可以使用 IF 函数和 2n 语句。Excel 对按位运算的支持相对较弱。减去 2n 可将数字转换为正确的负值。这些示例适用于 16 位数字。
  • 在以下 Excel 示例中,第 1 行展示了对从传感器接收的数据进行解码,而第 2 行展示了对要发送到器件的数据进行编码。
表 3-3 二进制补码的 Excel 示例
A B C
1 FFFF =HEX2DEC(A1) =IF(B1>=2^15,B1-2^16,B1)
2 -1 =IF(A2<0,A2+2^16,A2) =DEC2HEX(B2)
表 3-4 二进制补码的 Excel 计算结果
A B C
1 FFFF 65535 -1
2 -1 65535 FFFF
  • JavaScript 和 Python 都支持使用十六进制和按位运算符。

    • 0x8000 和 0x10000 相当于 215 和 216,无需使用额外的运算符。

    • 按位与比较可用于检查是否存在符号位,而不是进行大于等于的比较。

/* JavaScript */
/* decode from 8-bit 2's complement */
function decode(x) {return (x & 0x8000) ? x-0x10000 : x}
let n = decode(0xFFFF)
/* n is -1 */

/* encode to 8-bit 2's complement */
function encode(x) {return (x < 0) ? x+0x10000 : x}
let n = encode(-1).toString(16)
/* n is 'ffff' */
# Python
# decode from 8-bit 2's complement
def decode(x): return x-0x10000 if (x & 0x8000) else x
n = decode(0xFFFF)
# n is -1

# encode to 8-bit 2's complement
def encode(x): return x+0x10000 if (x & 0x8000) else x
n = hex(encode(-1))
# n is '0xffff'