我有一段从硬件寄存器读取两个字节的代码:
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++读取二进制值并假定它们是二进制补码格式?
发布于 2017-04-02 23:03:44
ostream::operator<<()在编译时检测参数类型-在本例中为short。它是一个带符号的类型,所以你可以做两件事
从函数返回的Cast值
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函数返回负值。
https://stackoverflow.com/questions/43169220
复制相似问题