【问题标题】:Converting signed to unsigned integer in C在C中将有符号整数转换为无符号整数
【发布时间】:2012-08-13 04:31:03
【问题描述】:

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

我尝试过的方法不起作用 - 移位并添加两个 8 位数字,然后在每一步将它们强制转换为无符号整数。 - union/struct 将这两个 8 位类型组合起来,并将结果编号转换为 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;

【问题讨论】:

    标签: c embedded


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      result = (ADCRHA << 8) & ADCRLA;
      

      【讨论】:

        【解决方案3】:

        如果您想查看未签名的值,则必须使用未签名的格式来打印该值。 %d 不是正确的格式。使用%u,您将看到它为unsigned

        【讨论】:

          【解决方案4】:

          你可以试试:

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

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

          【讨论】:

            猜你喜欢
            • 2012-01-09
            • 1970-01-01
            • 2017-07-21
            • 1970-01-01
            • 1970-01-01
            • 2014-02-20
            • 2014-01-13
            • 1970-01-01
            相关资源
            最近更新 更多