【背景】
我今天在打公司的项目一个临时版本时,看到代码中有一段是关于使用无符号整型类型的空间存储 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]));
...... //后面省略是对该u32_t的坐标数据做进一步处理
请观察以上注释和代码,按照我之前没考虑大小端的理解,错误的认为这边 Y 和 X 是写反的,因为 memcpy() 这个C库函数是将一段内存以第3个入参标定的大小,拷贝到另一段内存上去,所以内

本文探讨了在C++和C语言中,如何使用memcpy处理short类型的X和Y坐标存储到unsigned int变量中时遇到的大端小端问题。通过分析memcpy的工作原理和内存布局,解释了为何最初的直觉可能误导,并详细阐述了解决此类问题的关键点。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



