1

私はハードウェアレジスタとインターフェイスするCプログラムを読んでいました。その人は、次のような配列のインデックスとして16進数を使用しています。

app_base_add[0x30]  

a [i]は*(a + i)を意味します。これは*(a +(i * sizeof(typeof(a))))であるため、16進インデックスはおそらくアドレス空間内の目的のメモリ位置のオフセットですwrt app_base_add 。

これは正しいですか?
そしてまた与えられて、言う:

#define mm2s_start_add 0xc0000000;  

これらの割り当ては、使用法が互いにどのように異なりますか?

volatile unsigned int *app_base_add;  
app_base_add[0x30>>2]=0x1;    
app_base_add[0x30>>2]=1<<2;  
app_base_add[0x30>>2]=((unsigned int)mm2s_start_add);  //is this assignment valid??
app_base_add[0x30>>2]=((unsigned int *)mm2s_start_add);
4

3 に答える 3

2

インデックスとして 0x30 または 48 を書き込んでも違いはありません。メモリのドキュメントが 16 進値のみで書かれているとすれば、プログラマにとって読みやすいかもしれませんが、それは好みの問題です。

例えば

app_base_add[0x30>>2]=0x1; 
is the same as writing app_base_add[12]=0x1; 
or even app_base_add[0x0C]=0x1; 
于 2012-10-19T11:44:02.340 に答える
1

コンパイル時には、16 進数、2 進数、または 10 進数で記述されていても、すべての値が同じように扱われます。

0x2a == 42 == b101010 == 052

警告をスローする可能性がある唯一の代入は、へのキャストunsigned intです。unsigned int

于 2012-10-19T11:45:31.707 に答える
0

volatile unsigned int *app_base_add;
//app_base_add is a pointer to volatile memory(not initialized :()

app_base_add[0x30>>2]=0x1; // = app_base_add[12] = 1;

app_base_add[0x30>>2]=1<<2; // = app_base_add[12] = 4;

app_base_add[0x30>>2]=((unsigned int)mm2s_start_add); //is this assignment valid?? // yes its valid // = app_base_add[12] = 3221225472

app_base_add[0x30>>2]=((unsigned int *)mm2s_start_add); // = app_base_add[12] = interpret 3221225472 as an unsigned integer pointer and store it.

于 2012-10-19T11:44:31.767 に答える