我是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怎么样?
答案 0 :(得分:4)
您的代码行为未定义(将uint8_t *
视为uint16_t *
)。
话虽如此,您的代码还有另外两个问题,首先,您的计算机似乎是小端,例如最低位的字节位于最低地址(LSB),这是大多数机器的情况。第二,你有两个字节 - 85
和75
,你期望获得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 */
...
请注意,在绿地上,大多数情况下都不需要这种(“脏”)技巧。然而,你可能需要他们绕过破碎的规范......