C ++ 类型转换 double float , int32 em>, uint8 或 bool 没有丢失信息?如果无法返回错误?
修改 其实我还不够清楚......
我有一个函数,它将 double 和 type 作为参数。 此函数应检查我是否可以将 double 强制转换为类型而不会丢失信息。
bool check_type(double value, enumType type)
{
switch(type) {
case enum_uint8:
return "check wheter value can be typecasted to type"
break;
case enum_float:
.
.
.
}
return false;
}
答案 0 :(得分:2)
没有。这就像焚烧你的狗一样,你可以把它放在一个瓮中,以便更方便地搬家,然后当你发现你不能再将它恢复生机时,就会感到惊讶。
如果转换可能会丢失数据(这称为“缩小转换”),通常会得到编译器警告,但由于这取决于初始值,这些值通常仅在运行时才知道,你无法获得编译器错误 ...而且C ++的“轻量级”范例会阻止语言设计者让你的程序在运行时抛出异常或其他任何东西。
答案 1 :(得分:1)
由于double
比float
使用更多位来存储数据,如果您在double
中存储float
,则数据可能无法容纳在float
内大小int32
。因此,您将丢失一些数据。
作为uint8
,(function() {
foo = window.foo || {};
//this will not error
foo.helloWorld = function() {
console.log('helloWorld()');
};
foo.helloWorld();
//this will error
// foo.init();
foo.init = (function _foo() {
console.log('init()');
this.init = _foo;
return this.init
}).call(foo);
foo.init()
})();
仅存储整数值,C ++中的双精度存储为(1位符号)+ 2 ^(11位指数) 1 ( 52位有效),总计64位。所以你很有可能会丢失数据。 [这取自评论]
但是铸造是可能的。
顺便说一下,你可以通过检查double中的值是否大于你要投射的数据类型的最大限制来生成错误。
答案 2 :(得分:1)
也许尝试这样的事情:
#include <limits>
template<typename T>
inline bool is_in_allowed_range(double value)
{
return (
(value >= static_cast<double>(std::numeric_limits<T>::min())) &&
(value <= static_cast<double>(std::numeric_limits<T>::max()))
);
}
bool check_type(double value, enumType type)
{
switch(type) {
case enum_uint8:
return is_in_allowed_range<uint8>(value);
case enum_float:
return is_in_allowed_range<float>(value);
...
}
return false;
}
...
double value = ...;
if (check_type(value, enum_uint8))
{
uint u = static_cast<uint8>(value);
// use u as needed ...
}
或更简单:
#include <limits>
template<typename T>
bool convert_to_type(double value, T *arg)
{
if ((value >= static_cast<double>(std::numeric_limits<T>::min())) &&
(value <= static_cast<double>(std::numeric_limits<T>::max())))
{
*arg = static_cast<T>(value);
return true;
}
return false;
}
...
double value = ...;
uint8 u;
if (convert_to_type(value, &u))
{
// use u as needed...
}
答案 3 :(得分:0)
可以将一个双精度类型转换为浮点数,但是您将经历数字的舍入,因此它不会精确到前一个数字。双打不能安全地放入类似整数的类型或布尔值。
如果您在运行时进行检查,则无法在基本C ++中获取变量类型,但如果您在编译时执行它们,则可以使用variable :: typeid进行检查。检查信息丢失的选项是将一种方式转换为所需类型,转换回前一种类型,然后比较结果以查看信息是否已丢失