1)统一定义,其实不管是32位还是64位系统,long long都是表示64位的,所以比较简单的做法,就是32位和64位都使用long long来定义就没有问题,格式化输入输出时指定%ll就可以了。
2)但linux的stdin.h里uint64_t定义,在不同的系统下定义通过__WORDSIZE来区分,这样在printf的时候,就需要区分是%lu还是%llu。
#if __WORDSIZE == 64
typedef unsigned long int uint64_t;
#else
__extension__
typedef unsigned long long int uint64_t;
#endif
3)针对这种场景,可以考虑定义一个宏来表示64位的格式化的整数,到底是%ll还是%l,可以由编译器来指定,从而避免编码时,依赖机器或系统类型,提高代码可移值性。
#if __WORDSIZE == 64
#define U64_ "%lu"
#else
#define U64_ "%llu"
#endif
4)最后就是在printf的使用了,正常本来一串字符串,加入宏后,就不能在“”里直接加入宏名,这样宏名就变成字符串的一部分内容,而不是宏展开的内容, 需要把字符串分开,具体可见下面示例
uint64_t test;
printf("hello test=%lu end\m",test);// 一般使用方法
printf("hello test=""lu"" end\m",test);// 等效用法
printf("hello test="U64_" end\m",test);// 引用宏的定义
PS. 上面主要针对是linux的说明,但window逻辑上是一样的,window可能没有long long和lld的这种定义,但肯定会有类似的其他定义,通过这种方式就可以系统无关的编码