我不相信你声称变异(2)会产生你期望的行为,但是(1)和(3)会产生彼此不同的行为。此外,如果你确实是使用宏为你描述:
*(OSLongType *)(SRAM1)= 0;
那么你就不会看到之间的行为有什么区别(1)和(2)。
我倾向于假设你实际上有一个问题是沿着而不是
*(OSLongType *)SRAM1= 0;
线路有不同,含义与你的变化(1)和(3)比你的变化( 2)。例如,对于变体(1),其扩展为
*(OSLongType *)0xb0000000+((1024*1024)-64)= 0;
。演员和间接运营商有更高的优先级比不+
,所以这相当于
(*((OSLongType *)0xb0000000)) + ((1024*1024) - 64) = 0;
。这将不会编译,因为作业的左侧不是左值。变化(3)不能解决这个问题。
随着变化(2),然而,表达,而不是扩展到...
*(OSLongType *)(0xb0000000+((1024*1024)-64))= 0;
...这是完全有效的。地址以整数计算,然后转换为指针,然后解除引用。转换的结果是实现定义的,但代码至少应该编译,并且它可以做你想做的。
变量(1)和(3)之间唯一可能的差异是为整数常量选择的数据类型。常数1024
肯定具有类型int
,因此表达式1024*1024
也具有类型int
。如果你的系统的int
只有16位宽,那么1024和1024的算术乘积不适合16位整数。在这种情况下,该表达式的结果值是实现定义的,并且绝对不是1048576.然而,在这种情况下,常量1048676
表示类型long int
的有效值,使得(3)与(1)不同。
更新补充:
我会建议始终使用这种形式:
#define SRAM1 (0xb0000000+(((uintptr_t)1024*1024)-64))
类型uintptr_t
在stdint.h
定义,你会因此需要包括,如果你不这样做了。如果你受到这种一致性的帮助,你可以投入更多的演员到uintptr_t
,但他们没有必要。
你得到第一个错误是什么错误? – Magisch
系统崩溃。 –
请添加实际使用此宏的代码 – Shloim