阅读21世纪C时,我到达了第6章的“用NaNs标记异常数值”一节,其中解释了使用尾数中的位来存储一些任意位模式,将它们用作标记或指针的方法(书中提到WebKit使用了这种技术)。
我不确定我是否了解这种技术的效用,我认为这是一种hack(它依赖于硬件而不是NaN中尾数的值),但是来自我不习惯的Java背景C的粗糙度
这是在NaN中设置和读取标记的代码段
#include <stdio.h>
#include <math.h> //isnan
double ref;
double set_na(){
if (!ref) {
ref=0/0.;
char *cr = (char *)(&ref);
cr[2]='a';
}
return ref;
}
int is_na(double in){
if (!ref) return 0; //set_na was never called==>no NAs yet.
char *cc = (char *)(&in);
char *cr = (char *)(&ref);
for (int i=0; i< sizeof(double); i++)
if (cc[i] != cr[i]) return 0;
return 1;
}
int main(){
double x = set_na();
double y = x;
printf("Is x=set_na() NA? %i\n", is_na(x));
printf("Is x=set_na() NAN? %i\n", isnan(x));
printf("Is y=x NA? %i\n", is_na(y));
printf("Is 0/0 NA? %i\n", is_na(0/0.));
printf("Is 8 NA? %i\n", is_na(8));
}
它打印:
Is x=set_na() NA? 1
Is x=set_na() NAN? 1
Is y=x NA? 1
Is 0/0 NA? 0
Is 8 NA? 0
在JSValue.h上, webkit解释了编码,但没有解释为什么使用它。
该技术的目的是什么?空间/性能的好处是否足够高,可以平衡其骇人听闻的特性?