【发布时间】:2016-10-20 04:46:21
【问题描述】:
一开始我对 C 语言不是很流利——这听起来很简单明了,但尽管用谷歌搜索了它,但我在纯 C 语言中没有发现任何其他东西,而不是通常的
double theDouble = (double) theInt;
这在我的 Windows 64 位计算机上运行良好,但在 32 位 UNIX 系统 (Android) 上,我在这条线上得到了 SIGBUS。有没有一种很好的独立于平台的方式来将此 int 转换为双精度(我正在寻找执行真正的除法)
这里是代码的完整摘录:
int *rat;
BYTE *prm;
// blah blah some assignment is done on prm
rat = (int*)prm; //For RATIONAL decoding
prm = (BYTE*)&iOffset;
double rat0= (double)rat[0]; // SIGBUS here on the cast, only on the Android device not on Windows
我相信这是由于 Android 系统上 double 和 int 的分配大小不同造成的,除非我遗漏了什么。 This thread 似乎暗示这是我不应该做的事情,但这肯定是一个有效的用例吗?
【问题讨论】:
-
您在哪里分配了
int值?我会使用简单的int i = 1; double d = i;,如果int是64 位,它可能会生成关于失去意义的编译器警告。 -
请阅读内存分配。
-
将
int变量转换为double值是自动的并且是隐式发生的,您不需要显式转换。除非您使用无效的指针,否则它也不会导致崩溃。 -
SIGBUS 是访问无效内存的结果 - 它最常见的原因是访问内存映射文件中的数据超出了该文件的范围。它与将整数值转换为
double无关。如果在这种初始化时出现症状,那可能是因为theInt不再存在(例如,就程序而言,它占用的内存不再存在)。 -
&iOffset;未正确对齐 int 或 double。 (反正上面代码的意图不是很清楚)
标签: c type-conversion primitive-types