c使用#define和十六进制值代替十进制的良好编程习惯

riv*_*ock 1 c embedded hex

我正在努力改进我的嵌入式编码实践.下面的代码将值0写入内存位置0x80001000.

#define MemoryWrite(A,V) *(volatile unsigned long*)(A)=(V)
#define FLAG 2147487744 //0x80001000

uint32_t reset_value = 0;

int main(void)
{
    MemoryWrite(FLAG, reset_value);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 为了使用MemoryWrite我必须转换0x80001000为的宏2147487744.我认为这使得代码不清楚.有没有办法只使用十六进制值才能做到这一点?

  2. 我定义reset_valueuint32_t.如果我使用它会改变什么#define

Jul*_*ien 5

  1. 为了使用我必须转换0x80001000为的MemoryWrite宏2147487744.我认为这是不好的做法,也不清楚.有没有办法只使用十六进制值才能做到这一点?
#define FLAG 0x80001000u
Run Code Online (Sandbox Code Playgroud)

ufor unsigned不存在并且因为你在32位机器上有4个字节时,编译器假定该值是有符号的并且0x80001000 = -2147479552

  1. 我不确定是否定义reset_valueuint32_t良好做法.我可以这样做吗#define

你当然可以写#define RESET_VALUE 0.但是在这样简单的代码中,有用性并不明显.这取决于您是否要在将来修改该值.对于这10行示例,编译器肯定会以相同的方式对其进行优化.