简体   繁体   中英

How to return a 16 bit value as 64 bit?

// 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;
}

within caller:

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

I got the following on screen, What is wrong above?

counter value is 0x000045a5 returned timestamp is 0x00000000

counter value is 0x0000698f returned timestamp is 0x00000000

You are seeing this issue becasuse you print out the values incorrectly. there are dedicated printf format macros for the uint*_t types.

from the manpage of <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

so for example, to print a uint16_t and a uint64_t you could write (untested):

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

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

  return 0;
}

you should read man stdint.h and man inttypes.h if you are interested in the details, and what the semantics of the LEAST and FAST types are. very cool stuff.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM