c语言 - 如何确定我是否用括号括起来了?



我目前正在尝试避免在 C 中使用指针算术来编写模拟器。

通常,如果在 C 中向指针添加1,则会改为添加指向对象的大小。但是,我正在尝试使用位和字节,所以这是不希望的。

想知道我在这个例子中是否使用了太多括号:

*(int16_t *)(((intptr_t)bc)+sp)

如果不是,那么它等同于这个吗?

*(int16_t *)((intptr_t)bc+sp)

sp 是我的模拟器的页面对齐堆栈地址(通过 . mmap没有MAP_FIXED设置(。它是一种intptr_t类型。

bcint16_t *类型的名称。它是指向两个int8_t组合的指针。

(((intptr_t)bc)+sp)等效于((intptr_t)bc+sp)


但是这整个"避免指针算术"的方法不是可移植的。

至少 3 个问题:

  • 转换为整数的指针不一定能保持所需的数学属性。

    // possible outcome
    uint16_t x[2];
    printf("%llxn", (unsigned long long) (intptr_t) &x[0]); // --> abcd0000
    printf("%llxn", (unsigned long long) (intptr_t) &x[1]); // --> abcd0010
    

整数的差值可能是 16,而不是希望的 2 - 即使 2 的差值更常见。

  • 此外,对于*(int16_t *)((intptr_t)bc+sp),如果sp奇数,则(int16_t *)可能会由于对齐限制而失败。

  • 还会出现抗锯齿问题。 @Andrew亨勒

这种避免指针算术虽然整数有各种陷阱 - 祝你好运。

您要问的是运算符优先级。完整列表可以在这里找到。

"+"操作发生在类型转换操作之后。因此,您不需要第二层括号,因为intptr_t强制转换首先应用于bc,然后将结果添加到sp

最新更新