如何打印數值類型

問題如題目,在最近的工作中,使用 cppcheck 對代碼進行靜態檢查,遇到打印 size_t 類型以及其他類型的警告,再這裏記錄下。

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

各種數據類型的打印

先看 size_t 類型,應該要如何打印。如果用 %d ,會輸出如下警告:

image.png

嘗試使用 %u%lu%llu,都會有上述錯誤,這就很奇怪了,經過一番搜索,從這裏找到答案。

size_t 類型,既可以使用 %d 也可以使用 %zu,使用後者,cppcheck不會報移植可能性問題。這裏的 z 控制長度,u表示無符號整形值。

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 的區別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章