我有一个32位长的变量CurrentPosition,我希望将其分成4,8位字符。我如何在C中最有效地做到这一点?我正在使用8位MCU,8051架构。
unsigned long CurrentPosition = 7654321;
unsigned char CP1 = 0;
unsigned char CP2 = 0;
unsigned char CP3 = 0;
unsigned char CP4 = 0;
// What do I do next?
我应该用指针引用CurrentPosition的起始地址然后再添加8个地址四次?
这是小恩迪安。
我还希望CurrentPosition保持不变。
答案 0 :(得分:16)
CP1 = (CurrentPosition & 0xff000000UL) >> 24;
CP2 = (CurrentPosition & 0x00ff0000UL) >> 16;
CP3 = (CurrentPosition & 0x0000ff00UL) >> 8;
CP4 = (CurrentPosition & 0x000000ffUL) ;
您也可以通过指针访问字节,
unsigned char *p = (unsigned char*)&CurrentPosition;
//use p[0],p[1],p[2],p[3] to access the bytes.
答案 1 :(得分:7)
我认为你应该考虑使用联盟:
union {
unsigned long position;
unsigned char bytes[4];
} CurrentPosition;
CurrentPosition.position = 7654321;
现在可以访问字节:CurrentPosition.bytes [0],...,CurrentPosition.bytes [3]
答案 2 :(得分:2)
如果您正在使用8位MCU移位整个32位变量有点工作。在这种情况下,最好使用指针算法读取4个字节的CurrentPosition。演员:
unsigned char *p = (unsigned char*)&CurrentPosition;
不会更改CurrentPosition,但如果您尝试写入p [0],您将更改CurrentPosition的最低有效字节。如果您想要副本,请执行以下操作:
unsigned char *p = (unsigned char*)&CurrentPosition;
unsigned char arr[4];
arr[0] = p[0];
arr[1] = p[1];
arr[2] = p[2];
arr[3] = p[3];
与arr合作。 (如果您希望最重要的字节首先更改这些分配中的顺序)。
如果您更喜欢4个变量,您显然可以这样做:
unsigned char CP1 = p[0];
unsigned char CP2 = p[1];
unsigned char CP3 = p[2];
unsigned char CP4 = p[3];
答案 3 :(得分:0)
CP1 = (unsigned char)(CurrentPosition & 0xFF);
CurrentPosition >>= 8;
CP2 = (unsigned char)(CurrentPosition & 0xFF);
...
答案 4 :(得分:0)
unsigned char *CP = &CurrentPosition;
现在,您的原始代码的CPn可通过CP[n]
访问。
答案 5 :(得分:0)
我知道这是在不久前发布的。但对于仍在阅读帖子的人: 许多人采取顺序移动原始值的方法。为什么不让编译器为您完成工作。 使用工会&允许您将值存储在同一位置。定义一个由32位长变量组成的联合(这将是保存CurrentPosition的位置)和一个由4个char变量组成的结构。或者只是一个简单的8位整数数组。将CurrentPosition写入long变量时,它将存储在读取4个char变量时访问的相同位置。这种方法的劳动强度要小得多,并且不允许编译器完成工作而不是浪费时间和工作。资源。