用C语言从地址读取8位或16位或32位

时间:2016-12-07 15:05:39

标签: c

#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。

2 个答案:

答案 0 :(得分:0)

指针类型之间的转换不可移植,并且由于未对齐访问或编译器优化而会破坏。 (合理)可移植的方式是使用memcpy:

unsigned int a[1000] = {...};
unsigned long long x;
memcpy(&x, &a[57], sizeof(unsigned long long))

不要担心额外的函数调用 - gcc和clang都会识别此模式并优化对memcpy的调用。

答案 1 :(得分:0)

显然你所追求的并不是便携式的。您的观察结果显示,intlong在您的环境中具有相同的大小(最可能是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)。