printf的0x8llx格式在X86平台下,无法对double进行有效的格式化。
但是在ARM平台就可以。
同事告诉我的原因,可能是ARM平台拥有更多的冗余寄存器,可以完成这部分展开。
但是X86的寄存器却很少。
而且这个X86的非对齐访问有关系吗?
这段代码运行错误
static void do_it(const char *fname, double r[], double p[], double (*tri)(double)){ FILE* fd = fopen(fname, "w"); int i; double d; for (i = 0; i < POOL_MAX; i++) { d = tri(p[i]); r[i] = d; printf("%.16e\n",r[i]); printf("%.16e\n",d); printf("%d---%llx\n", i, r[i]); printf("%d---%llx\n", i, d); fprintf(fd, "%08llx\n", r[i]); } fclose(fd); }
这段代码运行正常
(而且如果你尝试用d=(unsigned long long int)l)这样方式,也会得到错的结果,一定要用memcpy。
X86的类型强制转换似乎非常保守,要么就是GCC的问题。
static void do_it(const char *fname, double r[], double p[], double (*tri)(double)){ FILE* fd = fopen(fname, "w"); int i; double d; unsigned long long int l; for (i = 0; i < POOL_MAX; i++) { d = tri(p[i]); r[i] = d; memcpy(&l, &r[i], sizeof(l)); printf("%.16e\n",r[i]); printf("%.16e\n",d); printf("%08llx\n", l); fprintf(fd, "%08llx\n", l); } fclose(fd); }