C++ 在这个转换链中,我如何得到负值?

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);//

我正在显示0-5范围内的压力值,小数点后两位。但是最近我得到了一个负值-0.05

有人能解释一下这个转换链是如何以负值结束的吗?我现在唯一的想法是输入值过高,但也许我没有看到什么

(从各种源文件一起复制)

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;