2016-12-07 137 views
-1
#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。从C语言地址读取8位或16位或32位

我想打印为55,也5566

+0

我不明白你想要做什么。你能发表一个更好的例子吗? – Fefux

+0

你在使用什么系统? – melpomene

+0

int不是8位,你可以使用8位无符号字符,甚至比outvalue不会打印5566 –

回答

0

指针类型之间的转换是不可移植的,并且将打破可怕由于对齐访问或编译器的优化。的(合理的)简单的方法是使用memcpy:

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

不要担心额外的函数调用 - GCC和铛会认识到这种模式和呼叫优化到memcpy了。

+0

MSVC不会优化这个,或者至少我从来没有看到它这样做。另一种合理的便携式方法是读取完整的原始宽度值,然后根据需要将其掩盖起来以适应较小的类型。 *所有*编译器都保证为其生成高效的代码。 –

+0

问题是关于将数据从较小类型复制到较大类型。 – jch

+0

我认为这很明显。编译器会对标量类型进行扩展,这是明确定义的行为。如你所提到的,如果你试图在*指针*类型之间进行转换,那就只有一个问题。 –