【发布时间】:2020-03-22 15:12:06
【问题描述】:
我收到了一个legacy code,其中有人不小心将double 值分配给int 变量,例如:
int a = 10;
double b = 20;
a = b;
现在要摆脱
警告 C4244:'=':从 'double' 转换为 'int',可能会丢失数据
警告,我尝试在上游编辑代码并删除不必要的double 变量,但结果太乱了!
我也可以使用强制转换:
a = (int) b;
但实际上不能保证b 会在整数的范围内。我想制作一个辅助函数:
int safeD2I(double inputVar){
if ((inputVar < INT_MAX) && (INT_MIN < inputVar)){
return (int) inputVar;
} else {
exit(-1);
}
}
但我不确定这是否是最好的实现。我想知道是否有更规范的方法来处理这个问题?
我想要什么:
- 如果
b变量超出整数范围,程序会立即停止 - 向终端打印一条错误消息,指出发生此问题的特定行和时间。
提前感谢您的支持。
【问题讨论】:
-
顺便说一句,您的代码将像现在一样传递 any 值。你需要
&&而不是||。 -
如果您正在寻找一种方法来查看是否有任何数据丢失,那么您似乎只是想做作业然后进行比较。例如
if( (double)a - b > epsilon) ... -
如果索引数组是转换的唯一原因,那么您的状态要好得多。创建一个函数,让您可以访问由
double索引的数组,将所有 double-to-size_t 转换本地化,并为您的特定数组实现边界检查器,因为MAX_INT通常是一个太大的索引,即使它适合int没有问题。 -
根据您的 C 熟练程度,我会非常谨慎对此代码进行任何不必要的或“清理”更改。你可能打破的比你修复的要多得多。仅在您已完成分析以确定存在活动错误的地方进行更改,并且不要重构要修复的内容。进行简单的直接内联修复。
-
见Can a conversion from double to int be written in portable C。这解决了范围问题,同时避免了未定义的行为,但是,一旦你处理了这个问题,处理分数问题就更容易了。
标签: c error-handling casting safety-critical