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;
}