美文网首页
c++ 无符号和有符号强转出现问题

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

作者: 送分童子笑嘻嘻 | 来源:发表于2019-10-14 19:03 被阅读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;
    }
    

    相关文章

      网友评论

          本文标题:c++ 无符号和有符号强转出现问题

          本文链接:https://www.haomeiwen.com/subject/umcdmctx.html