在C中将signed转换为无符号整数

时间:2012-08-16 18:58:23

标签: c embedded

我正在尝试将两个8位数组合成一个unsigned int,但无论我使用什么类型的转换,结果仍然是有符号数。使用CodeWarrior 10.1为飞思卡尔微处理器MC9S08LH64编译代码。

我试过的东西没用 - 移位并添加两个8位数,然后在每一步都将它们转换为unsigned int。 - union / struct将两个8位类型组合在一起,将结果数组合为unsigned int。 - 使用unsigned int指针(下面的代码)

unsigned int acquire_sensor_voltage_internal_adc()
{ //this is internal ADC
     unsigned int result;
     unsigned int* data_ptr;
     char print_buffer [50];
     int_convert cvt;
    //internal adc collecting counts of input voltage
    //______________________________________________

    //writing to ADCSC1A initiate the conversion sequence
    ADCSC1A= 0x09;
    while(!ADCSC1A_COCOA){}

    cvt.parts.p0 = ADCRHA;
    cvt.parts.p1 = ADCRLA;
    data_ptr = &cvt.int_number;
    result = (unsigned int)*data_ptr;

    sprintf(print_buffer,"here!!!>>>>>>>%d\r\n",result);
    serial_sendString(print_buffer,strlen(print_buffer));
    //_______________________________________________
    return (unsigned int) result;
}

//definition of int_convert from.h file
typedef union{
unsigned int int_number;
struct{
    unsigned char p0;
    unsigned char p1;
}parts;
}int_convert;

4 个答案:

答案 0 :(得分:3)

你可以尝试:

result = ((unsigned)ADCRHA) << 8 | (unsigned)ADCRHB;

然后使用正确的格式说明符%u而不是%d

答案 1 :(得分:0)

如果要查看未签名的,则必须使用无符号格式来打印该值。 %d不是正确的格式。使用%u,您会将其视为unsigned

答案 2 :(得分:0)

您正在将result打印为有符号整数,因为您使用%d格式printf。使用%u表示无符号整数(如果需要十六进制打印输出,则使用%x。)

sprintf(print_buffer, "here!!!>>>>>>>%u\r\n", result);

顺便说一句,使用按位运算而不是联合来将两个字节转换为单个unsigned int可能是个好主意。这样,您的代码将更容易移植到unsigned超过两个字节的其他编译器。假设LH中的ADCRLAADCRHA表示“低”和“高”:

result = (ADCRHA << 8) & ADCRLA;

答案 3 :(得分:0)

你不需要过于复杂的事情。这适用于任何HC08:

unsigned int ADC_result = *(unsigned int*) &ADCRHA;

HC08架构保证对ADC的两次读取同步,一旦读取到较高值,它就会使用内部硬件缓冲区来保存低字节。