【问题标题】:Platform independant cast from int to double in C (avoid SIGBUS)在 C 中从 int 到 double 的平台无关转换(避免 SIGBUS)
【发布时间】: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


【解决方案1】:

某些系统要求int 对象位于特定的字节边界上。您的 prm 指针可能不在这样的边界上。将memcpy 用于适当的int 变量,然后分配给您的double

int temp;
BYTE *rat = prm;
prm = (BYTE*)&iOffset;
memcpy(&temp, rat, sizeof(temp));
double rat0 = temp;

【讨论】:

猜你喜欢
  • 2013-05-31
  • 2019-03-02
  • 2015-10-07
  • 2017-02-17
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
相关资源
最近更新 更多