如何使用C将长值(32位)拆分为四个char变量(8位)?

我有一个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保持不变。

  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. 

我认为你应该考虑使用一个联盟:

 union { unsigned long position; unsigned char bytes[4]; } CurrentPosition; CurrentPosition.position = 7654321; 

这些字节现在可以访问为:CurrentPosition.bytes [0],…,CurrentPosition.bytes [3]

如果您正在使用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]; 
 CP1 = (unsigned char)(CurrentPosition & 0xFF); CurrentPosition >>= 8; CP2 = (unsigned char)(CurrentPosition & 0xFF); ... 
 unsigned char *CP = &CurrentPosition; 

现在,通过CP[n]访问每个原始代码的CPn。

我知道这是在不久前发布的。 但对于仍在阅读主题的人来说:许多人采取顺序移动原始值的方法。 为什么不让编译器为您完成工作。 使用union&允许您将值存储在同一位置。 定义一个由32位长变量组成的联合(这将是保存CurrentPosition的位置)和一个由4个char变量组成的结构。 或者只是一个简单的8位整数数组。 将CurrentPosition写入long变量时,它将存储在读取4个char变量时访问的相同位置。 这种方法的劳动强度要小得多,并且不允许编译器完成工作而不是浪费时间和资源。