11

我有一个 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 2 四次?

它是小尾数。

我也希望 CurrentPosition 保持不变。

4

6 回答 6

22
    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.
于 2010-04-30T19:49:50.897 回答
8

我认为您应该考虑使用联合:

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

CurrentPosition.position = 7654321;

现在可以通过以下方式访问字节: CurrentPosition.bytes[0], ..., CurrentPosition.bytes[3]

于 2010-04-30T20:03:11.973 回答
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];
于 2010-04-30T20:02:14.743 回答
0
CP1 = (unsigned char)(CurrentPosition & 0xFF);
CurrentPosition >>= 8;
CP2 = (unsigned char)(CurrentPosition & 0xFF);
...
于 2010-04-30T19:48:14.677 回答
0
unsigned char *CP = &CurrentPosition;

现在每个原始代码的 CPn 都可以通过CP[n].

于 2010-04-30T20:41:31.260 回答
0

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

于 2018-01-05T09:35:49.683 回答