c - 如何确定我是否过度括号?

标签 c emulation pointer-arithmetic

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

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

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

*(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("%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/

相关文章:

c - 再次出现 undefined reference 错误

c - 如何从用户空间程序访问 "Permission denied"file/sys/class/gpio/gpio2/direction

c - 完美的力量

android - 模拟器:错误:无法加载OpenGLES仿真库

c - 在整数数组的情况下,指针减法究竟是如何工作的?

c++ - 计算包含对象的this指针

c - 我想理解的 C 代码的一部分?

iphone - 在 iPhone 模拟器中测试音乐库

android - 编舞(639): Skipped 50 frames

c - 使用指针算术的字符串字谜