奇怪的X86

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);
	
}


转载于:https://my.oschina.net/rinehart/blog/167588

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值