#include <stdio.h>
#define READ8(Address) \
(*((volatile long *)(Address)))
int main()
{
int Array[2];
long out_value;
Array[0] = 55;
Array[1] = 66;
out_value = READ8(&Array[0]);
printf("%d\n", out_value);
}
我试图读取8位数据,16位数据和32位数据并存储在out_value变量中。我正在通过将宏中的数据类型更改为int / long来更改数据类型的读取大小,但每次输出仅打印为55.
我想打印为55和5566。
答案 0 :(得分:0)
指针类型之间的转换不可移植,并且由于未对齐访问或编译器优化而会破坏。 (合理)可移植的方式是使用memcpy:
unsigned int a[1000] = {...};
unsigned long long x;
memcpy(&x, &a[57], sizeof(unsigned long long))
不要担心额外的函数调用 - gcc和clang都会识别此模式并优化对memcpy
的调用。
答案 1 :(得分:0)
显然你所追求的并不是便携式的。您的观察结果显示,int
和long
在您的环境中具有相同的大小(最可能是4个字节),并以little-endian字节顺序存储。在定义sizeof(int)
时,您似乎认为int Array[2]
为2;如果您想要具有特定尺寸的数据类型,则应使用<stdint.h>
中的标准类型,对于16位,这将是int16_t
而不是int
。
我想打印为55和5566
如果您将控制器上的两个连续16位字(int16_t []){55, 66}
读入32位long
,则结果值不能是5566,而是4325431( 55 + 66×0x10000)。