繁体   English   中英

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

[英]Is it danger cast int * to unsigned int *

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

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

与铸造

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

我可以预期问题的价值永远不会消极吗?

在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;
}

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

这是未定义行为的代价。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM