首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C中数组索引中使用十六进制值

在C中数组索引中使用十六进制值
EN

Stack Overflow用户
提问于 2012-10-19 11:35:13
回答 3查看 4.6K关注 0票数 1

我正在读取一个C程序,它与硬件寄存器接口。此人一直使用十六进制数字作为数组的索引,例如:

代码语言:javascript
运行
复制
app_base_add[0x30]  

我知道ai的意思是*(a+i),它是*(a+(i*sizeof of (A),因此十六进制索引可能是地址空间w.r.t app_base_add中所需内存位置的偏移量。

是这样的吗?

也给了,比如说:

代码语言:javascript
运行
复制
#define mm2s_start_add 0xc0000000;  

这些作业在用法上有何不同?

代码语言:javascript
运行
复制
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);
EN

回答 3

Stack Overflow用户

发布于 2012-10-19 11:44:02

编写0x30或48作为索引没有什么不同,如果说他的内存文档只使用十六进制值编写,但这只是品味问题,那么对程序员来说就更容易阅读了。

例如:

代码语言:javascript
运行
复制
app_base_add[0x30>>2]=0x1; 
is the same as writing app_base_add[12]=0x1; 
or even app_base_add[0x0C]=0x1; 
票数 2
EN

Stack Overflow用户

发布于 2012-10-19 11:45:31

在编译时,所有的值都以相同的方式处理,即使它们是用十六进制、二进制或十进制编写的。

代码语言:javascript
运行
复制
0x2a == 42 == b101010 == 052

唯一可能引发警告的分配是对unsigned int的强制转换,因为目标类型不是unsigned int

票数 1
EN

Stack Overflow用户

发布于 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.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12973411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档