//// 16位无符号强转有符号 测试用例// 由于第一位表示正负的位是0,强制转换有符号后,仍然是0,所以无影响 0-32767 (32767=15个1,最左边符号位仍然是0)之间都是无影响的unsigned short* pUS = new unsigned short(32767); signed short* pS = (signed short*)pUS;std::cout << *pS << std::endl;// 如果32768 对应二进制位1000000000000000,如果是有符号的话,最左边一位表示符号,所以后面是0,最终结果也就是0unsigned short* pUS1 = new unsigned short(32768);signed short* pS1 = (signed short*)pUS1;std::cout << *pS1 << std::endl;// 存储的时候对应的字节数都是一样的,所以我们通常存储都用unsigned char* / signed char*都表示一个字节,再具体的计算的时候,一定结合实际的数据类型// 比如数据类型为short, 那么我们再内存操作的时候memcpy(pshort, pchar, length*sizeof(short)),每次要读取两个字节作为一个short// 然后再将内存的字节转换为实际的数字的时候,需要结合数据类型,分为有符号和无符号两种,// 比如我们将一个short(两个字节的内存)转换为一个unsigned short的数字的时候,short* pS2 = new short(0);*pS2 = 0xffff;unsigned short* pUS2 = (unsigned short*)pS2;std::cout << *pUS2 << std::endl;// 需要注意的是我们不用担心内存数据被破坏,我们只是将二进制的内存数据用不同的方式来解读而已,// 所以我们也不要在意,选择存储内存的时候是选择unsigned char* 还是 signed char*,都无所,因为二者所占字节数相同// 如果实际应用场景,全是16位也就是两个字节,那么选择内存的时候,最好选择short*/
16位无符号强转有符号 测试用例
由于第一位表示正负的位是0,强制转换有符号后,仍然是0,所以无影响 0-32767 (32767=15个1,最左边符号位仍然是0)之间都是无影响的
1、存储的时候对应的字节数都是一样的,所以我们通常存储都用unsigned char* / signed char*都表示一个字节,再具体的计算的时候,一定结合实际的数据类型
2、比如数据类型为short, 那么我们再内存操作的时候memcpy(pshort, pchar, length*sizeof(short)),每次要读取两个字节作为一个short
3、然后再将内存的字节转换为实际的数字的时候,需要结合数据类型,分为有符号和无符号两种,
4、需要注意的是我们不用担心内存数据被破坏,我们只是将二进制的内存数据用不同的方式来解读而已,
5、所以我们也不要在意,选择存储内存的时候是选择unsigned char* 还是 signed char*,都无所,因为二者所占字节数相同
6、如果实际应用场景,全是16位也就是两个字节,那么选择内存的时候,最好选择short*
一些自己的理解,可能存有误差,还望大佬指点一二