如何打印数值类型
问题如题目,在最近的工作中,使用 cppcheck
对代码进行静态检查,遇到打印 size_t
类型以及其他类型的警告,再这里记录下。
本文提到的打印输出,指的是 printf
函数或者 Format
函数中格式化的输出。
各种数据类型的打印
先看 size_t
类型,应该要如何打印。如果用 %d
,会输出如下警告:
尝试使用 %u
、%lu
和 %llu
,都会有上述错误,这就很奇怪了,经过一番搜索,从这里找到答案。
对 size_t
类型,既可以使用 %d
也可以使用 %zu
,使用后者,cppcheck
不会报移植可能性问题。这里的 z
控制长度,u
表示无符号整形值。
注意:%zu
格式打印在 VS2010 上会报错,在VS2019上不会报错。还是建议用 %d
类型。
size_t
在32位和64位下的定义不同:
#ifdef _WIN64
typedef unsigned __int64 size_t;
#else /* _WIN64 */
typedef unsigned int size_t;
语言标准规定:sizeof(int) <= sizeof(long) <= sizeof(long long)
既然说到这里,针对 无符号整形值、有符号整形值,要如何无警告地打印呢?
-
有符号整形值 int --》 %d
-
有符号整形值 long --》 %ld
-
有符号整形值 long long --》 %lld
-
无符号整形值 unsigned int --》 %u
-
无符号整形值 unsigned long --》 %lu
-
无符号整形值 unsigned long long --》 %llu
从上面可知,d
表示有符号,u
表示无符号,一个l
表示一个long
。
上面是语言基础类型的打印,还有不同编译器,自带的标准库定义的平台无关类型,如上面的 size_t
、__int64
、_int64
`
细节注意
在打印同类变量时,要保证输出格式一致性。如果是16进制输出,那么所有地方都要是16进制输出,并且输出前缀名称要一致,这样方便在日志文件中搜索定位。
从使用者的角度去查看日志信息,看各种打印信息的一致性、可搜索性、是否有助于问题定位。
参考链接