我目前正在尝试避免 C 中的指针算术工作来编写模拟器。
通常,如果您将 1
添加到 C 中的指针,则会添加所指向对象的大小。但是,我正在尝试使用位和字节,因此这是不希望的。
我想知道我在这个例子中是否使用了太多括号:
*(int16_t *)(((intptr_t)bc)+sp)
如果不是,那么它相当于这个吗? :
*(int16_t *)((intptr_t)bc+sp)
sp
是我的模拟器的页面对齐堆栈地址(通过 .mmap
获得,未设置 MAP_FIXED
)。它是一个 intptr_t
类型。
bc
是 int16_t *
类型的名称。它是一个指向两个 int8_t
组合的指针。
最佳答案
(((intptr_t)bc)+sp)
相当于 ((intptr_t)bc+sp)
。
但是整个“避免指针算术”方法是不可移植的。
至少 3 个问题:
转换为整数的指针不一定能保持所需的数学属性。
// possible outcome uint16_t x[2]; printf("%llx\n", (unsigned long long) (intptr_t) &x[0]); // --> abcd0000 printf("%llx\n", (unsigned long long) (intptr_t) &x[1]); // --> abcd0010
作为整数的差异可能是 16,而不是希望的 2——即使 2 的差异更常见。
此外,对于
*(int16_t *)((intptr_t)bc+sp)
,如果sp
为奇数,则(int16_t *)
由于对齐限制可能会失败。抗锯齿问题也会发生。 @Andrew Henle
尽管整数有各种陷阱,但这种避免指针运算的方式 - 祝你好运。
关于c - 如何确定我是否过度括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55419302/