我正在嵌入式系统上编写 C 语言。处理器架构是 32 位(sizeof(int)
就是 32 位,sizeof(short)
就是 16 位)。有一个 32 位变量是一个内存映射控制寄存器 ( CTRL_REG
),它被指定为仅使用的低 16 位,它们包含一个带符号的 16 位整数值(写入高位无效)。内存访问必须是 32 位对齐的,所以我不能只将指针撞到几个字节上,也不能假设字节序。我担心自动类型提升会通过将符号位扩展到第 31 位而不是将其留在我想要的第 15 位来弄乱我存储的任何内容。在这个位置存储东西的最佳方式是什么?
这是我的原始代码,我几乎可以肯定它是错误的:
#define CTRL_REG *((volatile unsigned int *)0x4000D008u)
short calibrationValue;
CTRL_REG = -2 * calibrationValue;
然后我尝试了这个,但我认为它仍然可能在分配时受到整数提升:
CTRL_REG = (short)(-2 * calibrationValue);
然后最后我想到了这个:
CTRL_REG = (unsigned short)(short)(-2 * calibrationValue);
我不能很好地评估这些选项,因为它们都在我的测试中起作用,因为calibrationValue
恰好是负数(它是每个设备特定的校准参数,因此在某些设备上可能是正数),所以在乘以 -2 后,我结束up 存储一个正值,因此我实际上并没有遇到我在测试中期望的问题。
非常感谢您的帮助,即使只是说“您想太多了”。