C语言中,使用 printf 正确格式化输出 unsigned long long int 类型的数据。这是一个常见的问题,因为不同整数类型需要使用不同的格式说明符。建议优先使用 %llu 或 <inttypes.h> 中的 PRIu64,确保类型安全与可移植性。

1、格式化 unsigned long long int

C 中,unsigned long long int 是一个 无符号的 64 位整数(在大多数现代系统上)。要使用 printf 正确地输出它。

需要使用格式说明符%llull 表示 long long 类型(可能是 64 位),u 表示 unsigned(无符号)。

#include <stdio.h>

int main() {
    unsigned long long int value = 123456789012345ULL;
    printf("The value is: %llu\n", value);
    return 0;
}

注意:避免使用%lu%u 这些格式说明符是用于 unsigned longunsigned int 类型的。如果你用它们来打印 unsigned long long,在某些平台上会导致错误输出或未定义行为。

2、跨平台兼容性

为了更好地跨平台支持,可以使用 C99 中引入的 <inttypes.h>,配合 PRIu64 宏来格式化 uint64_t 类型变量。

#include <stdio.h>
#include <inttypes.h>

int main() {
    uint64_t value = 123456789012345ULL;
    printf("The value is: %" PRIu64 "\n", value);
    return 0;
}

3、使用场景举例

1)处理大整数

#include <stdio.h>
int main() {
   unsigned long long totalBytes 
   = 9223372036854775808ULL;
   printf("Total bytes: %llu\n", totalBytes);

  return 0;
}

2)计算组合/排列等数学值

#include <stdio.h>
int main() {
  unsigned long long factorial = 1;
  for (int i = 1; i <= 20; i++) {
      factorial *= i;
  }
  printf("20! = %llu\n", factorial);

  return 0;
}

3)唯一 ID 编号(如 Twitter Snowflake ID)

#include <stdio.h>
int main() {
  
  unsigned long long id = 16345729384729384729ULL;
  printf("User ID: %llu\n", id);
  
  return 0;
}

4)文件大小或系统级统计

#include <stdio.h>
int main() {
  
  // 1TB
  unsigned long long fileSize 
  = 1099511627776ULL;    
  printf("文件大小:%llu 字节\n", fileSize);

  
  return 0;
}