-1

我有 2 个数组:第一个是 8 个无符号字符,第二个是 4 个无符号短数组,对于某些算法兼容性问题,我需要将短数组与 char 数组的值一起使用,为此我正在做环形

j = 0;
for(i=0; i<8; i+=2)
{
    short_array[j] = *(unsigned short*) (char_array + i);
    j++;
}

在这里一切正常,但是在以前的一些尝试中,我尝试了以下方法(这显然不是正确的答案)

j = 0;
for(i=0; i<8; i+=2)
{
    short_array[j] = (unsigned short*) *(&(char_array + i));
    j++;
}

问题:

假设以下char_array = {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88} 当我做第一个时 short_array = {0x1122, 0x3344, 0x5566, 0x7788} 但是当我做第二个时, short_array = {0x3344, 0x5566, 0x7788, ???} (其中 ??? 是未定义的,因为它是内存中的一个值,可能会改变)。

你能解释我为什么会这样吗?

PS:我的编译器套件是 Keil 的 C251

4

2 回答 2

0

我已经比较了 2 个解决方案(即使第二个不是有效的),这绝对是一个编译器问题,首先编译器不应该让我编译&(char_array + i),然后我发现(在检查程序集时代码)char_array 在第二种情况下在循环中访问它之前递增;并且在第一种情况下(正确的情况下)读取变量后进行增量。似乎没有比编译器实现问题更多的解释......

于 2013-06-12T10:48:12.657 回答
-1

我建议手动读出 char 数组中的每个元素,并将每对 char 构建成一个 short 。我知道可能有更快的方法,但是您隐式地跨过了您在 char 数组中指定的类型的界限。另外,我会声称我的版本在您的意图方面更容易阅读,尽管更笨拙。

也就是说,像这样:

忽略第一个代码块……这就是我不睡觉时发生的事情!

j=0;
uint16_t temp;  // recommend to use these types for portability
for(i=0; i<8; i+=2) {
  temp = 0x0000;
  temp += (uint16_t)(char_array[i] << 8);
  temp += (uint16_t)(char_array[i+1]);
  short_array[j] = temp;
  j++;
}

此外,这是我在对问题进行更多思考后提出的一种更快的方法,并给自己一个当之无愧的自我强加的代码审查。

j=0;
  for(i=0; i<8; i+=2) {
  short_array[j] = (char_array[i] << 8) | char_array[i+1];  // use bitwise operations
  j++;
}
于 2013-06-12T08:48:04.153 回答