C 负数问题

C 负数问题,c,pic,C,Pic,我有这个简单的代码 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 con

我有这个简单的代码

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。
任何修复它的提示,或者有其他转换方法。

我认为问题可能来自对utoa函数的调用

utoa功能原型一般如下

char * utoa(unsigned int n, char * buffer, int radix);
在代码中,您已反转了前两个参数。您正在通过此调用修改ADC结构。我很好奇,这本书怎么能在编译时没有任何错误?任何体面的编译器都会抱怨传递的参数不是指针类型

尝试以下方法

utoa(ADC.res, ADC_num, 10);
假设现在温度为负值-x.yz

现在l=-x,和

温度=-x.yz--x=-0.yz

与10相乘,并转换为无符号整数。通常,这会导致未定义的行为6.3.1.4 1:

当实浮点类型的有限值转换为除_Bool以外的整数类型时,小数部分被丢弃,即该值被截断为零。如果整数部分的值不能用整数类型表示,则行为未定义。61

61整数类型的值转换为无符号类型时执行的余数运算,在实浮点类型的值转换为无符号类型时不需要执行。因此,可移植实浮点值的范围是−1,Utype_MAX+1

但是,无论如何,将负值转换为无符号int都会产生错误的结果,即使完成了余数运算,您需要的是绝对值,因此您应该转换

rem = (unsigned int)fabsf(temprature * 1e1);

那里。

您能粘贴ADC结构的定义吗?我们无法用这么少的信息准确回答这个问题。别让我们猜。请提供一个。更改它们会导致此错误212.13整数到指针的非法转换您使用的编译器是什么?如何在编译器头中定义utoa函数原型?您可以尝试以下操作:utoaADC.res,&ADC_num[0],10;但我不明白为什么它会抱怨,如果原型是PIC10/12/16 MCU Lite Mode V9.83版权C 2011 Microchip Technology Inc.的通用oneHI-TECH C编译器。在我的文档中,utoa是char*utoachar*buf,unsigned val,int base;Ok这是可能的,因为utoa函数不是ISO C标准函数的一部分。PIC编译器绝对是异国情调的编译器…没有好的错误[499];0未定义符号:_fabstemp.obj fabsf是标准库的一部分。我想您的嵌入式编译器不支持它,这是允许独立实现的。因此,如果温度<0 temprature=-temprature,则使用;得到绝对值。是的,如果温度为零,整数部分l应该为负。取温度-=l;后的绝对值;,所以分数部分是非负的。考虑t= -3.125。t-=l后;剩下的是t=-0.125。现在,您想要打印-3.1,所以您想要rem=unsigned int0.125*10;`l=符号温度;温度-=l//浮标;rem=无符号温度*10;如果温度
l = (signed int) temprature;
temprature -= (float) l;
rem = (unsigned int)(temprature* 1e1);
rem = (unsigned int)fabsf(temprature * 1e1);