我遇到了在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字节)整数。
答案 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]))
一步一步地做什么:
char*
转换为U32 *
(指向1个字节的指针变为指向4个字节的指针)