我有这个“简单”的代码。
union
{
unsigned int res;
char bytes[2];
} ADC;
char ADC_num[5];
float temprature;
void vis_temp (void) // Show temp..
{
signed int l, length;
unsigned int rem;
GO_nDONE=1; // initiate conversion on the channel 0
while (GO_nDONE) continue;
ADC.bytes[0]=ADRESL;
ADC.bytes[1]=ADRESH;
utoa(ADC_num, ADC.res, 10);
temprature = (float) ADC.res * 478.1 / 1024;
temprature = temprature - 50.0;
l = (signed int) temprature;
temprature -= (float) l;
rem = (unsigned int)(temprature* 1e1);
sprintf(&ADC_num, "%i.%u", l, rem);
当读取
ADC_res
(引脚,温度传感器上的电压)该温度为0度或更低时,程序将写入“ 0.65500”而不是“ -3.5”或类似值。我应该声明该权利为有符号和无符号int。
修复它的任何提示,或有其他转换方法。
最佳答案
temprature = (float) ADC.res * 478.1 / 1024;
temprature = temprature - 50.0;
现在假设
temprature
具有负值-x.yz
。l = (signed int) temprature;
现在
l = -x
,然后temprature -= (float) l;
temprature = -x.yz - (-x) = -0.yz
。rem = (unsigned int)(temprature* 1e1);
乘以10,然后转换为
unsigned int
。通常,这会导致未定义的行为(6.3.1.4(1)):当实数浮点型的有限值转换为
_Bool
以外的整数类型时,小数部分将被丢弃(即,该值将被截断为零)。如果整数部分的值不能用整数类型表示,则行为未定义(61)。61)当将整数类型的值转换为无符号类型时,无需执行余数运算。因此,可移植实际浮点值的范围为
(−1, Utype_MAX+1)
。但是将负值转换为
unsigned int
无论如何都会产生错误的结果,即使完成余数运算,您想要的还是绝对值,因此您应该转换rem = (unsigned int)fabsf(temprature * 1e1);
那里。
关于c - 负数问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14425155/