2016-12-07 4 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型のマクロでデータ型を変更することでデータ型の読み込みサイズを変更していますが、putを55としてのみ出力します。私はポインタ型間のキャスト55とも5566.C言語のアドレスから8ビットまたは16または32ビットを読み取る

+0

あなたは何をしたいのか分かりません。より良い例を投稿できますか? – Fefux

+0

これを実行しているシステムは何ですか? – melpomene

+0

intが8ビットでない場合、outvalueが印刷されない場合でも、8ビットのunsigned charを使用できます。5566 –

答えて

0

として印刷したい

はポータブルではない、とによる非整列アクセスに恐ろしく壊れるまたは最適化をコンパイラに。 (合理的に)移植可能な方法でのmemcpyを使用することです:

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

余分な関数呼び出しを心配しないでください - gccと打ち鳴らすの両方が、このパターンを認識し、離れmemcpyへの呼び出しを最適化します。

+0

MSVCはこれを最適化しません。少なくとも、私はこれを見たことがありません。合理的に移植可能なもう1つのアプローチは、完全なネイティブ幅の値を読み取ってから、より小さい型に収まるようにマスクすることです。 *すべての*コンパイラは、そのための効率的なコードを生成することが保証されています。 –

+0

問題は、より小さなタイプからより大きなタイプへデータをコピーすることでした。 – jch

+0

私はそれが明らかだと思った。コンパイラはスカラー型の拡張をうまく行います。これは明確に定義された動作です。あなたが言及したように*ポインタ*型の間でキャストしようとすると問題が発生します。 –

関連する問題