【问题标题】:Does C++ read binary numbers as two's complement by default?默认情况下,C++ 是否将二进制数读取为二进制补码?
【发布时间】:2017-08-27 09:50:30
【问题描述】:

我有一段代码从硬件寄存器中读取两个字节:

short MPU9250::combineRegisters(unsigned char msb, unsigned char lsb){
        //shift the MSB left by 8 bits and OR with LSB
        return ((short)msb<<8)|(short)lsb;
    }

设备中的实际数据是大端格式,所以我读取两个字节并将它们组合起来以二进制补码形式得到实际值。但是,当我将数据输出到控制台时,例如:

cout << combineRegisters(registerA, registerB) << endl;

C++ 自动为我提供带有适当加号/减号的整数值。我没有说明我从设备得到的二进制值是二进制补码形式。

怎么样?这是否意味着 C++ 读取二进制值并假定它们是二进制补码格式?

【问题讨论】:

  • 无前缀的short通常是签名的。
  • 哎呀,你自己的用户名怎么拼错了...
  • 仅供参考,您似乎误解了一些术语。 “Endian 格式” 没有意义。它可以是大端或小端,它(几乎)总是这两者之一。
  • @KerrekSB 是故意这样做的。哈哈..
  • @HolyBlackCat 感谢您指出这一点,是的,这是大端序。

标签: c++ binary type-conversion


【解决方案1】:

ostream::operator&lt;&lt;() 在编译时检测参数类型 - 在您的情况下为 short。它是带符号的类型,所以你可以做两件事

函数返回的转换值

cout << static_cast<unsigned short>(combineRegisters(registerA, registerB)) << endl;

或者修改函数本身

unsigned short MPU9250::combineRegisters(unsigned char msb, unsigned char lsb) {
    //shift the MSB left by 8 bits and OR with LSB
    return (static_cast<unsigned short>(msb << 8) | static_cast<unsigned short>(lsb);
}

我推荐第二种变体,因为您不打算从 MPU9250::combineRegisters 函数返回负值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多