我正在读取一个C程序,它与硬件寄存器接口。此人一直使用十六进制数字作为数组的索引,例如:
app_base_add[0x30]
我知道ai的意思是*(a+i),它是*(a+(i*sizeof of (A),因此十六进制索引可能是地址空间w.r.t 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);
发布于 2012-10-19 11:44:02
编写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;
发布于 2012-10-19 11:45:31
在编译时,所有的值都以相同的方式处理,即使它们是用十六进制、二进制或十进制编写的。
0x2a == 42 == b101010 == 052
唯一可能引发警告的分配是对unsigned int
的强制转换,因为目标类型不是unsigned int
。
发布于 2012-10-19 11:44:31
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.
https://stackoverflow.com/questions/12973411
复制相似问题