Membaca Abad 21 C Saya tiba di bab 6 di bagian "Menandai Nilai Numerik Luar Biasa dengan NaNs" , di mana ia menjelaskan penggunaan bit dalam mantissa untuk menyimpan beberapa pola bit sewenang-wenang, untuk menggunakannya sebagai marker atau pointer (buku ini menyebutkan bahwa WebKit menggunakan teknik ini).
Saya tidak begitu yakin saya mengerti kegunaan teknik ini, yang saya lihat sebagai peretasan (ini bergantung pada perangkat keras yang tidak peduli pada nilai mantissa dalam NaN) tetapi berasal dari latar belakang Java yang tidak biasa saya gunakan. kekasaran C.
Berikut ini potongan kode yang menetapkan dan membaca penanda di 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));
}
itu mencetak:
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
dan di webkit JSValue.h menjelaskan pengkodean, tetapi tidak mengapa itu digunakan.
Apa tujuan dari teknik ini? Apakah manfaat ruang / kinerja cukup tinggi untuk menyeimbangkan sifat peretasannya?