[英]What does "signed `size_t`" mean in the printf documentation?
我正在查看關於 cppreference ( https://en.cppreference.com/w/c/io/fprintf ) 的 printf 文檔,我注意到當使用z
修飾符和d
說明符時,類型被列為“signed size_t
”。 這讓我很好奇,所以我調查了為什么不使用ssize_t
只是為了發現ssize_t
是 POSIX 類型而不是標准類型。 那么,這是什么類型的期待? 在尋找有符號的size_t
類型時,我找不到除ssize_t
以外的任何東西。
編輯:澄清一下,我在問我會用什么數據類型來表示一個有符號的size_t
“signed size_t
”的確切類型是實現定義和AFAIK,沒有標准方法來獲取類型。 所以我沒有看到可以%zd
地使用%zd
的方法。 在大多數平台上, ptrdiff_t
應該是size_t
的簽名版本,但這並不能保證。 實際上, ptrdiff_t
有一個t
格式修飾符,它也可以與u
說明符一起使用,例如%tu
,意思是“無符號ptrdiff_t
”。 我認為這些組合只是為了完整性,沒有實際用途。
術語“signed size_t
”是非正式使用的,不會出現在語言標准中。 事實上,如果你試圖在 C 代碼中使用它,那將是一個語法錯誤。
C 標准說z
長度修飾符:
指定后面的
d
、i
、o
、u
、x
或X
轉換說明符適用於size_t
或相應的有符號整數類型參數; 或者后面的n
轉換說明符適用於指向與size_t
參數對應的有符號整數類型的指針。
沒有可移植的方法來確定相應的有符號整數類型是什么。 即使特定於 POSIX 的ssize_t
類型(在<sys/types.h>
定義)也沒有指定為對應於size_t
的有符號類型。 正如 chux 在評論中指出的那樣,在某些實現中ssize_t
比size_t
更寬可能是有意義的,因此它可以表示最大SIZE_MAX
所有值(當然還有負值)。
實際上, size_t
通常是預定義的無符號整數類型unsigned int
、 unsigned long int
或unsigned long long int
之一的 typedef,然后%zd
將需要int
、 long int
或long long int
類型的參數, 分別。 size_t
也可能是根據一些擴展整數類型定義的。
我的猜測是,標准的作者根本不想去努力指定z
長度修飾符僅適用於有符號類型。 這樣做會增加復雜性而沒有真正的好處。 如果您使用符合 POSIX 的實現,您可能可以使用%zd
打印ssize_t
類型的值。
%zd
沒有便攜用途,但是在printf
使用它是無害的,並且可能比沒有它更容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.