认识PRIu64

1、PRIu64

在32位平台 typedef unsigned long long int uint64_t; 在64位平台 typedef unsigned long int uint64_t; 不同的typdef,要求在printf中使用不同的length modifier,uint64_t 在32位使用ll,在64位使用l。除了定义数据类型,C99还定义了相应数据类型的打印方式,使用PRIu64打印uint64,举例如下:

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


int main(int argc, char *argv[])
{
        uint64_t u64 = 100;
        printf("uint64: %"PRIu64"\n", u64);
        printf("uint64: %"PRIu64, u64);
        // printf("uint64: %lu\n", u64);   x86_64
        // printf("uint64: %llu\n", u64);  x86
        return 0;
}

除了PRIu64外,inttypes.h还定义了其它数据类型对应的宏。另外,如果是c++程序,需要定义__STDC_FORMAT_MACROS宏。

2、printf()

https://baike.baidu.com/item/printf%28%29/402521?fr=aladdin

规定符 %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x, %X 无符号以十六进制表示的整数 %o 无符号以八进制表示的整数 %g 把输出的值按照%e或者%f类型中输出长度较小的方式输出 %p 输出地址符 %lu 32位无符号整数 %llu 64位无符号整数

(1).可以在“%”和字母之间插进数字表示最大场宽。 (2).可以在“%”和字母之间加小写字母l,表示输出的是长型数。 (3).可以控制输出左对齐或右对齐,即在"%"和字母之间加入一个"-"号可说明输出为左对齐, 否则为右对齐。

主要是注意%u和%lu的区别。

3、PRIu64和llu的区别

其中以 int32_ t 为例其代表一个有符号的整数,在标准库stdint.h中,宏PRId32和PRIu64在inttypes.h中,其内部包括与整数有关的宏,详情请查看下方连接

intyypes.h: https://pubs.opengroup.org/onlinepubs/009695399/basedefs/inttypes.h.html

当编译为64位程序时,宏 PRId32 展示形成字符串 “d” 宏PRIu64展示形成字符串 “lu”。

因此示例中printf的调用就转化为

printf("x = %d, y = %lu\n", x, y); 因此使用宏能保证:无论代码是如何被编译的,都能生成正确的格式字符串。

#include <inttypes.h>  
printf("%" PRId64 "\n", value);

这是一种跨平台的书写方式,主要是为了同时支持32位和64位操作系统。PRId64表示64位整数,在32位系统中表示long long int,在64位系统中表示long int。相当于:

printf("%" "ld" "\n", value);  //64bit OS
printf("%" "lld" "\n", value);  //32bit OS

或者

printf("%ld", value); // 64bit OS  
printf("%lld", value); // 32bit OS

results matching ""

    No results matching ""