指针输出结果

时间:2015-10-06 18:46:14

标签: c pointers

我是C新手,期望输出为8575,但输出为19285。任何人都可以帮助解决这里可能出现的问题吗?

int main()
{
    uint8_t a[4] = {85,75,95,65};
    uint16_t *p = a;
    uint16_t q = (p[0]);
    printf("%u",(unsigned int)(q));
    return 0;
}

//新问题

typedef struct{
uint32 a[4];
}x;

/*declare an object of x type*/
x *block2;

uint8 b[64] = {0x01 , 0x02 , 0x03.....0x64}

Api-1
converts b into block* type by
block2 = (x*) b;

这个block2怎么样?

3 个答案:

答案 0 :(得分:4)

您的代码行为未定义(将uint8_t *视为uint16_t *)。

话虽如此,您的代码还有另外两个问题,首先,您的计算机似乎是小端,例如最低位的字节位于最低地址(LSB),这是大多数机器的情况。第二,你有两个字节 - 8575,你期望获得8575,将每个字节视为100的幂(85 * 100 + 75 = 8575),而字节是256的幂(85 * 256 + 75 = 21835

考虑到这些事实,我们得到结果编号:75 * 256 + 85 = 19285

转换此类数据的安全方法,当已知缓冲区的endianess(在本例中为big endian)时,将分别处理每个字节:

uint8_t buff[] = {1, 2, 4, 5};
uint16_t my16;
my16 = buff[0] << 8; // same as * 256
my16 += buff[1];

答案 1 :(得分:3)

uint8高达255,所以你认为正确的结果应该是85 * 100 + 75,它真的是75 * 256 + 85 = 19285,因为你的平台也有字节顺序可以反转。 / p>

答案 2 :(得分:0)

[渴望评论]

要正确对齐8位和16位变量,因此允许从8位指针转换为16位指针,您可以使用联合:

#include <stdint.h>

union Align_to_16bit
{
  uint8_t array_u8[4];
  uint16_t dummy; /* This takes care of 16bit alignment. */
}   


int main(void)
{
  union Align_to_16bit aligned_to_16bit = 
  {
    {85, 75, 95, 65};
  }

  uint16_t * p = (uint16_t*) &aligned_to_16bit; /* dirty, but allowed */

  ...

请注意,在绿地上,大多数情况下都不需要这种(“脏”)技巧。然而,你可能需要他们绕过破碎的规范......