gpt4 book ai didi

c - 至未签名并返回 : Casting Pointer vs Casting Dereference

转载 作者:行者123 更新时间:2023-11-30 15:38:31 25 4
gpt4 key购买 nike

假设您不关心编译器和机器的转换风格,以下之间是否存在明显差异:

#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>

static int64_t tosigned (void *p)
{
return *(int64_t *)p;
}

int main (void)
{
int64_t i = 0xfabf00d0badf00d;
uint64_t u = 0xabad1deacafebabe;
printf("%"PRId64 "\n" "%"PRId64 "\n", tosigned(&i), tosigned(&u));
return 0;
}

还有这个?

#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>

static int64_t tosigned (void *p, int isunsigned)
{
return isunsigned ? (int64_t)*(uint64_t *)p : *(int64_t *)p;
}

int main (void)
{
int64_t i = 0xfabf00d0badf00d;
uint64_t u = 0xabad1deacafebabe;
printf("%"PRId64 "\n" "%"PRId64 "\n", tosigned(&i, 0), tosigned(&u, 1));
return 0;
}

使用 clang -S -std=c99 -Wall -Wextra 进行 -O2 及更高版本的程序集转储显示输出没有差异。但是,我想知道是否有更“正确”的方法来做到这一点,或者第一种方法是否会遇到未定义或特定于实现的行为。

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

背景:

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

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

最佳答案

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

第二种方法,将整数转换为有符号整数,由 C 标准定义,前提是该值可以用目标类型表示 (6.3.1.3 1),否则由实现定义(并且可能会陷入陷阱)(6.3.1.3 3) .

关于c - 至未签名并返回 : Casting Pointer vs Casting Dereference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21718109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com