【问题标题】:Using hex values in array index in C在C中的数组索引中使用十六进制值
【发布时间】:2012-10-19 11:35:13
【问题描述】:

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

app_base_add[0x30]  

我知道 a[i] 表示 *(a+i) 即 *(a+(i*sizeof(typeof(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);

【问题讨论】:

  • 无论你用十六进制还是十进制(或者八进制,如果你愿意)写索引对编译器没有影响。没有任何。最后一个赋值有点问题,因为您首先将一个整数转换为一个指针,然后将该指针转换回一个整数。如果编译器是宽松的,它可以按原样编译它,否则你需要在转换为指针类型后显式转换为整数类型。
  • @DanielFischer:十六进制和十进制确实会对编译器产生影响。这在数组索引中不太重要,但可能会产生影响。请参阅我对以下答案之一的评论。
  • @EricPostpischil 对,如果您想要负索引,您可能需要使用十六进制表示法显式转换为有符号类型。虽然重要的案例很少,但我应该提到它。

标签: c arrays


【解决方案1】:

将 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; 

【讨论】:

    【解决方案2】:

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

    0x2a == 42 == b101010 == 052
    

    唯一可能引发警告的赋值是转换为unsigned int,因为您的目标类型不是unsigned int

    【讨论】:

    • 无论使用何种基数,都以相同的方式处理值是不正确的。在 int 中不可表示的十六进制值的类型为 unsigned int(如果它们可以在其中表示),而在 int 中不可表示的十进制值的类型为 long int(如果它们在那)。这在数组索引中不太重要,但它可能会产生影响。对于常见的 32 位整数和 64 位长整数,a[2147483648-2147483649]a[-1]a[0x80000000-0x80000001]a[4294967295]
    【解决方案3】:

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

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

    app_base_add[0x30&gt;&gt;2]=1&lt;&lt;2; // = app_base_add[12] = 4;

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

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

    【讨论】:

      猜你喜欢
      • 2015-05-24
      • 2015-05-24
      • 2011-06-01
      • 2014-01-04
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多