如何打印数值类型

问题如题目,在最近的工作中,使用 cppcheck 对代码进行静态检查,遇到打印 size_t 类型以及其他类型的警告,再这里记录下。

本文提到的打印输出,指的是 printf 函数或者 Format 函数中格式化的输出。

各种数据类型的打印

先看 size_t 类型,应该要如何打印。如果用 %d ,会输出如下警告:

image.png

尝试使用 %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进制输出,并且输出前缀名称要一致,这样方便在日志文件中搜索定位。

从使用者的角度去查看日志信息,看各种打印信息的一致性、可搜索性、是否有助于问题定位。

参考链接

  1. __int64 与long long 的区别
posted @ 2023-03-13 15:40  浩天之家  阅读(138)  评论(0编辑  收藏  举报