2012-08-16 100 views
3

我想將兩個8位數字組合成一個無符號整數,但無論我使用什麼類型的轉換,結果仍然是有符號數。該代碼使用CodeWarrior 10.1 for Freescale微處理器MC9S08LH64進行編譯。C中轉換有符號整數

我試過的東西沒有工作 - 移位並添加兩個8位數然後在每一步中將它們轉換爲無符號整型。 - 聯合/結構來結合兩個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; 
+0

怎麼樣(結果<<1)>> 1 – perilbrain 2012-08-16 19:02:46

回答

3

你可以嘗試:

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

然後使用正確的格式說明%u而不是%d

+0

我認爲只有%d是罪魁禍首....:thumbsup:...用於計算.... – perilbrain 2012-08-16 19:06:09

+0

yay,格式說明符解決了它...謝謝cnicutar! – user1604121 2012-08-16 19:07:48

0

如果你想看到一個未簽名的,你必須使用無符號格式來打印該值。 %d不是正確的格式。使用%u,你會看到它爲unsigned

0

由於對printf使用%d格式,因此您正在將result打印爲有符號整數。使用%u來表示無符號整數(如果您想要十六進制打印輸出,則使用%x)。

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

順便說一句,它很可能是使用位運算,而不是工會的兩個字節轉換爲單個unsigned int一個好主意。這樣,你的代碼將更容易移植到unsigned超過兩個字節的其他編譯器。假設在ADCRLALHADCRHA意味着「低」和「高」:

result = (ADCRHA << 8) & ADCRLA; 
0

你不需要過分複雜的事情。這將在任何HC08工作:

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

的HC08架構保證了兩次讀取到ADC是同步的,它使用內部硬件緩衝區儘快較高的讀取保存低字節。