在 here 上求 float 绝对值的算法. 这是如何工作的?
//find absolute value
double x;
*(((int *) &x) + 1) &= 0x7fffffff;
我不明白为什么需要偏移 1。它说:
the IA32 64-bit sign bit is 0x80000000 at an int address offset of +1.
有人可以分解并解释一下吗?
最佳答案
该代码在技术上是无效的 C,因为它违反了严格的别名规则。但是,如果您告诉您的编译器不要滥用别名规则,并且您可以保证 double
和 int
像在 x86 上一样在内存中布局:
(int *)&x
是指向x
的指针。加 1 将指针向前移动 4 个字节。取消引用它会为您提供 double
的第 4 到第 7 个字节。您屏蔽了它的高位,因为那是 double
的最后一个字节。
顺便说一句,您可以通过使用 char *
并添加 7 而不是 1 来阻止这成为别名冲突。它仍然非常不可移植。
关于c - 这个 fabs() 的实现是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18327573/