首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >默认情况下,C++是否将二进制数读取为二进制补码?

默认情况下,C++是否将二进制数读取为二进制补码?
EN

Stack Overflow用户
提问于 2017-04-02 22:01:17
回答 1查看 462关注 0票数 1

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

代码语言:javascript
复制
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;
    }

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

代码语言:javascript
复制
cout << combineRegisters(registerA, registerB) << endl;

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

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

EN

回答 1

Stack Overflow用户

发布于 2017-04-02 23:03:44

ostream::operator<<()在编译时检测参数类型-在本例中为short。它是一个带符号的类型,所以你可以做两件事

从函数返回的Cast值

代码语言:javascript
复制
cout << static_cast<unsigned short>(combineRegisters(registerA, registerB)) << endl;

或者修改函数本身

代码语言:javascript
复制
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函数返回负值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43169220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档