【发布时间】:2015-07-14 21:38:16
【问题描述】:
/* [1] */
int i = -1;
unsigned u = (unsigned)i;
/* [2] */
int i = -1;
unsigned u;
memcpy(&u, &i, sizeof i);
/* [3] */
int i = -1;
unsigned u = *(unsigned *)&i;
为了将有符号整数位复制到它的无符号伙伴,[1] 应该可以在大多数机器上工作,但据我所知,这并不能保证行为。
[2] 应该完全符合我的要求,但我想避免调用库函数的开销。
那么[3]呢?它是否有效地实现了我的意图?
【问题讨论】:
-
严肃的问题 - 是什么让这个问题值得一票否决?
-
[1] 定义明确。是否满足你对“位拷贝”的要求是另一回事。
-
我希望,虽然它当然不能保证,许多编译器将强度减少
memcpy()调用。我认为这将是我的第一选择,因为它非常清楚地传达了意图(虽然我觉得sizeof u更安全,但目的地的大小更重要)。 -
只是出于好奇:你为什么需要这个?有什么实际用途,还是只是出于兴趣而问?
-
@xiver77 如果您不知道带符号数字的格式,那么您无法确定您的 rng 的 pmf 是否一致(或您规定的任何 pmf),因为不同的位值可以产生相同的整数值(特别是对于那些恭维和符号幅度)