C++ 在这个转换链中,我如何得到负值?
我正在显示0-5范围内的压力值,小数点后两位。但是最近我得到了一个负值-0.05 有人能解释一下这个转换链是如何以负值结束的吗?我现在唯一的想法是输入值过高,但也许我没有看到什么 (从各种源文件一起复制)C++ 在这个转换链中,我如何得到负值?,c++,C++,我正在显示0-5范围内的压力值,小数点后两位。但是最近我得到了一个负值-0.05 有人能解释一下这个转换链是如何以负值结束的吗?我现在唯一的想法是输入值过高,但也许我没有看到什么 (从各种源文件一起复制) double value=; 值-=1//减去大气压力 值*=100;//保留小数位 无符号int ui_值=静态_转换(值); int intValue=ui_value;//uint值被输入到以int为参数的函数中 双v=((双)intValue)/std::pow(10.0f,2);//
double value=;
值-=1//减去大气压力
值*=100;//保留小数位
无符号int ui_值=静态_转换(值);
int intValue=ui_value;//uint值被输入到以int为参数的函数中
双v=((双)intValue)/std::pow(10.0f,2);//缩减
std::stringstream-tmp;
tmp从double
类型到unsigned
的转换是未定义的,当unsigned
不能“表示”double
的值时,例如double
值为负值。我的重点是:
浮点类型的prvalue可以转换为任何整数类型的prvalue。小数部分被截断,即小数部分被丢弃如果该值不能放入目标类型,则行为未定义(即使目标类型为无符号,模运算也不适用)
要删除该标志,只需使用std::abs
(“abs”是缩写)。做:
当
unsigned
不能“表示”double的值时,从double
类型到unsigned
的转换未定义,例如double
值为负值。我的重点是:
浮点类型的prvalue可以转换为任何整数类型的prvalue。小数部分被截断,即小数部分被丢弃如果该值不能放入目标类型,则行为未定义(即使目标类型为无符号,模运算也不适用)
要删除该标志,只需使用std::abs
(“abs”是缩写)。做:
unsigned int ui\u value=static\u cast(值);int intValue=ui_值代码>?转换为无符号整数然后转换为整数有什么意义?双值=0.95
将导致-0.05
。所以有一些真正的代码有一个函数,它接受一个int,这里没有显示。相反,你发布了一些不同的代码。好的,显示真实的代码,请创建一个。如果以value=0
开始,则得到unsigned int ui\u value=static\u cast(-100)代码>然后int intValue=ui\u值代码>。这两行中至少有一行会导致未定义的行为。我本以为它会删除符号。
当然,但随后int intValue=ui\u value代码>在那之后你期望得到什么值我本以为它会很好地去除标志,但事实并非如此。从技术上讲,代码在该步骤中具有未定义的行为。如果要去除符号,请使用std::abs(x)
unsigned int ui\u value=static\u cast(value);int intValue=ui_值代码>?转换为无符号整数然后转换为整数有什么意义?双值=0.95
将导致-0.05
。所以有一些真正的代码有一个函数,它接受一个int,这里没有显示。相反,你发布了一些不同的代码。好的,显示真实的代码,请创建一个。如果以value=0
开始,则得到unsigned int ui\u value=static\u cast(-100)代码>然后int intValue=ui\u值代码>。这两行中至少有一行会导致未定义的行为。我本以为它会删除符号。
当然,但随后int intValue=ui\u value代码>在那之后你期望得到什么值我本以为它会很好地去除标志,但事实并非如此。从技术上讲,代码在该步骤中具有未定义的行为。如果要去除符号,请使用std::abs(x)
@Thomas Sablik,但unsigned int不能表示-100.0。这个评论和这个答案不矛盾吗?
Och-my,你是对的,我错了。我看到了ui\u value=-100
(即int
到unsigned
的转换),但是你写了ui\u value=100.0
,对不起,我的眼睛。@Thomas Sablik但是unsigned int不能代表-100.0。这个评论和这个答案不矛盾吗?
Och-my,你是对的,我错了。我看到了ui\u value=-100
(即int
到unsigned
的转换),但是你写了ui\u value=100.0
,对不起,我的眼睛。
double value = <the input value in bar>;
value -= 1; //subtract atmospheric pressure
value *= 100; // preserve decimal places
unsigned int ui_value = static_cast<unsigned int>(value);
int intValue = ui_value; // uint value is input into a function taking int as argument
double v = ((double)intValue) / std::pow(10.0f, 2); // scale back
std::stringstream tmp;
tmp << std::fixed << std::setprecision(2) << v;
double v = std::abs(value) / 100.0f;