2015-06-09 2 views
0
// Returns 64 bit mac timer count value 
uint64_t get_timestamp() 
{ 
    uint16_t cnt; 
    cnt = read_counter(); 
    printk ("counter value is 0x%x\n", cnt); 
    return cnt; 
} 

в вызывающей:Как вернуть 16-битное значение как 64 бит?

uint64_t ts;   
ts = get_timestamp(); 
printk ("returned timestamp is 0x%x \n", ts); 

я получил следующее на экране, Что случилось выше?

значение счетчика является 0x000045a5 отметка времени является 0x00000000

значение счетчика является 0x0000698f отметка времени является 0x00000000

+0

Я думаю, вам нужен другой формат спецификатора для 64-битных целых чисел, а не только '% x'. См. [Что такое аргумент для printf, который форматирует длинный?] (Http://stackoverflow.com/questions/38561/what-is-the-argument-for-printf-that-formats-a-long). Но не спрашивайте меня: '% lx','% llx', '% l64x' или что-то в этом роде. – CodesInChaos

+0

проблема с форматом. Значения будут неявно приведены к правильному типу, поэтому в большинстве случаев вам не нужно беспокоиться об этом. –

ответ

0

Вы видите этот вопрос becasuse вы распечатать значения неправильно. выделены макросы формата printf для типов uint*_t.

из страницы руководства по <inttypes.h>:

The fprintf() macros for signed integers are: 


      PRIdN  PRIdLEASTN PRIdFASTN PRIdMAX  PRIdPTR 
      PRIiN  PRIiLEASTN PRIiFASTN PRIiMAX  PRIiPTR 

    The fprintf() macros for unsigned integers are: 


      PRIoN  PRIoLEASTN PRIoFASTN PRIoMAX  PRIoPTR 
      PRIuN  PRIuLEASTN PRIuFASTN PRIuMAX  PRIuPTR 
      PRIxN  PRIxLEASTN PRIxFASTN PRIxMAX  PRIxPTR 
      PRIXN  PRIXLEASTN PRIXFASTN PRIXMAX  PRIXPTR 

так, например, чтобы напечатать uint16_t и uint64_t вы могли бы написать (непроверенные):

int main (void) 
{ 
    uint16_t a = 13; 
    uint64_t b = 37; 

    printf("uint16_t: %" PRIx16 ", uint64_t: %" PRIx64 "\n", a, b); 

    return 0; 
} 

вы должны прочитать man stdint.h и man inttypes.h если вы интересуются деталями, и какова семантика типов LEAST и FAST. очень классный материал.

Смежные вопросы