将无符号转换为指针,再将其转换回来:强制转换指针与强制转换间接引用。

假设您不关心编译器和计算机的转换样式,下面两段代码有显著的区别吗?

汇编转储使用 clang -S -std=c99 -Wall -Wextra-O2 及以上的级别的输出没有区别。然而,我想知道是否有一种更“正确”的方法来做这件事,或者第一种方法是否会遇到未定义的或实现特定的行为。

我假设将指针转换为相同类型的无符号版本与转换指针解引用的结果一样好。

背景:

我正在为 Lua 编写 int64 库,当进行类型转换进行算术运算时遇到了这个学术问题。

我在 Lua 堆栈上存储 int64_t 和 uint64_t 用户数据(存储在 Lua 运行时中的不透明 C 块)。有“元方法”来执行算术运算,例如,对于 x + y"__add",而不是引发类型错误,因为您不能(通常)对非数字执行算术运算。然而,有符号和无符号值以不同的类型存储,因此不兼容。我对第二个参数执行更广泛的转换,将其转换为与第一个参数相同的带符号性。isunsigned 参数大致匹配“此表是否具有无符号类型?”运行时返回存储值的 void 指针,如何进行转换由您决定。

点赞
用户298225
用户298225

第一种方法,即指针转换,是被 C 标准允许的,因为 C 2011(N1570)6.5 7 允许通过与对象的有效类型相对应的有符号或无符号类型访问对象。也就是说,允许将一个无符号整数访问为相同大小的有符号整数,反之亦然。(值得注意的是,这种别名是 C 标准明确允许的一个特殊情况。许多其他指针转换,在解引用之后,都将违反 6.5 7 指定的别名规则。)

第二种方法,即将整数转换为有符号整数,如果该值在目标类型中可表示,则被 C 标准定义(6.3.1.3 1),否则为实现定义(并可能陷入陷阱)(6.3.1.3 3)。

2014-02-12 11:20:42