2012-10-19 22 views
1

我正在通過與硬件寄存器接口的C程序進行讀取。該人已使用十六進制數爲索引到陣列如:在數組索引中使用十六進制值C

app_base_add[0x30] 

我知道,A [1]表示*(A + I),其是*(A +(I *的sizeof(typeof運算 (a)))),所以十六進制索引可能是地址空間中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); 
+3

無論你寫索引以十六進制或十進制(或者八進制,如果你願意的話)的符號對編譯器沒有任何影響。沒有任何。最後一個賦值有點問題,因爲你首先將一個整數轉換爲一個指針,然後將該指針轉換爲一個整數。如果編譯器是寬鬆的,它可能會按原樣編譯它,否則在轉換爲指針類型後,您需要顯式強制轉換爲整數類型。 –

+0

@DanielFischer:十六進制和十進制對編譯器有所作用。這在數組索引中不太可能發生,但可能會產生影響。看到我的評論下面的答案之一。 –

+0

@EricPostpischil對,如果你想要負指數,你可能需要顯式轉換爲帶十六進制符號的帶符號類型。儘管重要的情況很少,但我應該提到它。 –

回答

2

沒有區別寫的0x30或48指數,如果說他對內存的文件只用十六進制值,但它只是口味的問題寫它可能只是更容易閱讀的程序員。

例如

app_base_add[0x30>>2]=0x1; 
is the same as writing app_base_add[12]=0x1; 
or even app_base_add[0x0C]=0x1; 
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.

1

在編譯的時候,所有值都會被他們同樣的方式,即使他們都寫在十六進制,二進制或十進制。

0x2a == 42 == b101010 == 052 

可能拋出一個警告的唯一assignement是投給unsigned int,因爲你的目標類型不是unsigned int

+0

不管使用的基數是多少,都會以相同的方式處理值。不能在int中表示的十六進制值的類型爲'unsigned int'(如果它們可以表示的話),而不能在'int'中表示的十進制值的類型爲'long int'(如果它們是在此表示)。這在數組索引中不太可能發生,但它可能會產生影響。對於常見的32位整數和64位長整數,a [2147483648-2147483649]爲a [-1],但是[0x80000000-0x80000001]爲a [4294967295]。 –

相關問題