在C中的char数组中存储无符号整数的问题

时间:2013-10-24 11:39:55

标签: c arrays unsigned

我遇到了在C中的字符数组中存储无符号整数的问题。我的代码是

static unsigned char dataArray[8];


// values before are 2400 and 2100
// array layout: 0 0 0 0 0 0 0 0

U32 sysTime1 = 2400;
U32 sysTime2 = 2100;

dataArray[0] = sysTime1;
dataArray[4] = sysTime2;

// values after are 96 and 52
// array layout: 96 0 0 0 52 0 0 0

如何获取要存储在数组中的正确值?我认为如果你在索引0的char数组中存储了一个四字节数据类型,它将从索引0到3占用空间,依此类推。任何帮助将非常感激。 U32是无符号的32位(4字节)整数。

3 个答案:

答案 0 :(得分:3)

union u
{
    unsigned char dataArray[8];
    U32 sysTime[2];
}

u s;
s.sysTime[0]=2400;
s.sysTime[0]=1200;

答案 1 :(得分:2)

您的分配截断值,因为您只分配了它们的最低字节。

你需要做这样的事情

*((U32 *) &dataArray[0]) = sysTime1;
*((U32 *) &dataArray[4]) = sysTime2;

或使用例如memcpy

memcpy(&dataArray[0], &sysTime1, sizeof(sysTime1));
memcpy(&dataArray[4], &sysTime2, sizeof(sysTime2));

当然,您可以获取并分配值的每个字节:

dataArray[0] = (sysTime1 >> 24) & 0xff;
dataArray[1] = (sysTime1 >> 16) & 0xff;
dataArray[2] = (sysTime1 >>  8) & 0xff;
dataArray[3] =  sysTime1        & 0xff;

(对另一个人来说也一样。)

答案 2 :(得分:2)

你错了。你要做的是将4字节整数拟合到1字节dataArray[0]。此分配将通过在MSB端截断3个字节将您的int值转换为char 你实际上(可能)尝试做的是:

memcpy(&dataArray[0], &sysTime1, sizeof(U32));

这会将sysTime中的所有4个字节复制到dataArray中的前4个字节 这样你就可以访问sysTime值的任何字节,但是不能通过调用dataArray [0]来读取你的整数,因为它只能给你1个字节的原始值。) / p>

如果您想要阅读自己的价值,则必须将char的地址转换为U32的地址:

*((U32*)(&dataArray[0]))

一步一步地做什么:

  1. dataArray [0] - > dataArray的第一个元素>
  2. & dataArray [0] - >获取dataArray的第一个元素的地址(char * - 指向1个字节的指针)
  3. (U32 *)(& dataArray [0]) - >将char*转换为U32 *(指向1个字节的指针变为指向4个字节的指针)
  4. *(U32 *)(& dataArray [0]) - >取消引用上述结果(从给定地址读取四个字节)