危险是否将int *转换为unsigned int *

时间:2016-01-23 13:37:37

标签: c++

我有int * alen类型的变量。试图将其传递给函数:

typedef int(__stdcall *Tfnc)(
    unsigned int *alen
    );

铸造

(*Tfnc)( (unsigned int *)alen )

我可以预期案件价值永远不会出现问题吗?

2 个答案:

答案 0 :(得分:3)

根据C ++标准,您正在做的是未定义的行为。据我所知,无法保证无符号和有符号整数的内存布局兼容。

在大多数平台上(使用2s补码整数),这不会有问题。

剩下的问题是严格别名,编译器可以自由地假定指向一种类型的指针和指向另一种类型的指针不是指向同一事物的指针。

typedef int(__stdcall *Tfnc)(
  unsigned int *alen
);

int test() {
  int x = 3;
  Tfnc pf = [](unsigned int* bob) { *bob = 2; };
  pf((unsigned int*)&x);
  return x;
}

上述代码可能被允许忽略对x的修改,同时通过unsigned int*进行修改,即使在2s补码硬件上也是如此。

这是未定义行为的代价。

答案 1 :(得分:0)

没有它不会出现任何问题,除非您传递的int值不是负数。 但是如果给定值为负,则结果值是与源整数一致的最小无符号整数(模2 ^ n,其中n是用于表示无符号类型的位数)。