将数组char转换为数组short时的奇怪行为

时间:2013-06-12 08:22:47

标签: c arrays casting

我有2个数组:第一个是8个unsigned char,第二个是4个unsigned short,对于某些算法兼容性问题,我需要使用带有char数组值的short数组,这样做我'我做了一个循环

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-1)

我建议手动读出char数组中的每个元素,并将每对chars构建为short。我知道可能有更快的方法,但是你隐式地跨越了char数组中特定类型的边界,否则。此外,我会声称我的版本在你的意图方面稍微容易阅读,虽然更多的是kludgy。

就是这样:

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

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++;
}