我有这个“简单”的代码。

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/

10-08 22:37