在C语言中将有符号整数转换为无符号整数

3
我试图将两个8位数组合为无符号整数,但无论使用何种类型转换,结果仍然是有符号数字。该代码是使用CodeWarrior 10.1编译的,用于freescale微处理器MC9S08LH64。
我尝试过但不起作用的方法有: - 移位并添加两个8位数字,然后在每个步骤中将它们强制转换为无符号int。 - 使用union / struct组合两个8位数并将它们及结果数字类型转换为无符号int。 - 使用无符号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个回答

3
您可以尝试以下方法:
result = ((unsigned)ADCRHA) << 8 | (unsigned)ADCRHB;

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


0
如果你想看到一个无符号数,你必须使用无符号格式来打印该值。"%d" 不是正确的格式。使用 "%u",你将会看到它是 "unsigned"。

0

不需要把事情复杂化。这将适用于任何HC08:

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

HC08架构保证ADC的两次读取同步进行,它使用内部硬件缓冲区在高位被读取后立即保存低位。


0
你正在打印 result 作为有符号整数,因为你在 printf 中使用了 %d 格式。使用 %u 表示无符号整数(或者如果你想要十六进制输出,可以使用 %x)。
sprintf(print_buffer, "here!!!>>>>>>>%u\r\n", result);

顺便说一下,使用按位操作而不是联合来将两个字节转换为一个无符号整数可能是个好主意。这样你的代码在其他编译器上更具可移植性,其中unsigned超过两个字节。假设ADCRLAADCRHA中的LH表示“低”和“高”:
result = (ADCRHA << 8) & ADCRLA;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接