【背景】
我今天在打公司的项目一个临时版本时,看到代码中有一段是关于使用无符号整型类型的空间存储 X 和 Y 坐标时踩了个坑;
当时觉得之前写这个的同事写反了,但是后来通过将两个坐标和 memcpy() 处理后的 unsigned int 类型数字以十六进制打印后发现,原来自己同事没有写反,那就纠结了,瞬间想到以前好像在书上看过类似问题是大小端引起的,经过网上查文章和敲代码思考过后,决定晚上回来写下今天的思路历程和结果。话不多说,进入正题。(下面这段可跳过,主要是为什么产生疑问和发现问题的)
【需求和疑问】
这个需求很简单其实就是将算法给过来的点坐标 X 和 Y (两个是 short 类型,各占16位,下文中使用 s16_t),存储到一个 unsigned int 类型(占32位,下文中使用 u32_t)的变量中,其中高16位存储 X, 低16位存储 Y;大概代码如下:
...... //前面是一些将算法坐标结果从队列中pop出来的代码
u32_t headpoint; // 在后面的正确使用中,高16位是 X,低16位是 Y
s16_t tempArr[2] = {0, 0};
...
tempArr[0] = traj.center.Coor.nCoorY; //这个traj是从队列取出的,nCoorX和nCoorY都是s16_t的
tempArr[1] = traj.center.Coor.nCoorX;
memcpy(&headpoint, tempArr, 2 * sizeof(tempArr[0]));
...... //