c++ 无符号和有符号强转出现问题

2019-10-14  本文已影响0人  送分童子笑嘻嘻

串口通信将16个字节的有符号分成两个8字节的无符号

#include <iostream>
#include<bitset>
using namespace std;
int main() {
    int x = 1<<7;
    bitset<16> bx(x);
    cout << "bx=" << bx << endl;
    //无符号转换为有符号 二进制没改,
    //负数前进位是很完美的,但是
    //前8个字节在强转,不会出问题,主要是后8个字节转换会出问题
    int16_t zhongli = 990;
    bitset<16> bs1(zhongli);
    cout << "bs1=" << bs1 << endl;

    int16_t zhongliqian = zhongli >> 8;
    bitset<16> bs2(zhongliqian);
    cout << "bs2=" << bs2 << endl;
    int8_t zhongliqian8 = (int8_t )zhongliqian;
    bitset<8> bs3(zhongliqian8);
    cout << "bs3=" << bs3 << endl;
    int8_t zhonglihou8 = (int8_t) zhongli;
    bitset<8> bs4(zhonglihou8);
    cout << "bs4=" << bs4 << endl;
    cout << "zhonglihou8=" << zhonglihou8 << endl;

    uint8_t uzhongliqian8 = (uint8_t) zhongliqian8;
    bitset<8> bs4u(uzhongliqian8);
    cout << "bs4u=" << bs4u << endl;
    uint8_t uzhonglihou8 = (uint8_t) zhonglihou8;
    bitset<8> bs5u(uzhonglihou8);
    cout << "bs5u=" << bs5u << endl;

    uint16_t uzhongliqian16 = (uint16_t) zhongliqian8<<8;
    bitset<16> bs5uu(uzhongliqian16);
    cout << "zhongliqian16=" << uzhongliqian16 << endl;
    cout << "bs5uu=" << bs5uu << endl;
    uint16_t uzhonglihou16 = (uint16_t)zhonglihou8;
    bitset<16> bs6uu(uzhonglihou16);
    cout << "zhonglihou16=" << uzhonglihou16 << endl;
    cout << "bs6uu=" << bs6uu << endl;

    int16_t zhongliqian16 = (int16_t) zhongliqian8<<8;
    bitset<16> bs5(zhongliqian16);
    cout << "zhongliqian16=" << zhongliqian16 << endl;
    cout << "bs5=" << bs5 << endl;
    int16_t zhonglihou16 = (int16_t)zhonglihou8;
    bitset<16> bs6(zhonglihou16);
    cout << "zhonglihou16=" << zhonglihou16 << endl;
    cout << "bs6=" << bs6 << endl;
    //通过下面这个方法,解决了后8个byte为负数时转为16进制前面全市1的问题
    if (zhonglihou16<0) {
        int8_t temp_zhonglihou8 = (1<<7)+zhonglihou8;
        bitset<16> bs6t(temp_zhonglihou8);
        cout << "bs6t=" << bs6t << endl;
        int16_t temp_zhonglihou16 = (int16_t)temp_zhonglihou8;
        temp_zhonglihou16 += (1<<7);
        bitset<16> bs6tt(temp_zhonglihou16);
        cout << "bs6tt=" << bs6tt << endl;
    }
return 0;
}
上一篇下一篇

猜你喜欢

热点阅读