【问题标题】:How to return a 16 bit value as 64 bit?如何将 16 位值返回为 64 位?
【发布时间】:2015-06-09 07:44:18
【问题描述】:
// 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;
}

在调用者内:

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

我在屏幕上看到以下内容,上面有什么问题?

计数器值为0x000045a5 返回的时间戳是0x00000000

计数器值为0x0000698f 返回的时间戳是0x00000000

【问题讨论】:

  • 我认为您需要为 64 位整数使用不同的格式说明符,而不仅仅是 %x。见What is the argument for printf that formats a long?。但不要问我%lx、%llx、%l64x 是否正确。
  • 问题出在格式上。值将被隐式转换为正确的类型,因此在大多数情况下您无需担心。

标签: c 64-bit printf


【解决方案1】:

您看到此问题是因为您错误地打印出值。 uint*_t 类型有专用的 printf 格式宏。

来自<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 类型的语义。很酷的东西。

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 2015-09-19
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多