簡體   English   中英

關於不兼容 printf 格式說明符的問題

[英]question about incompatible printf format specifiers

我只是在瀏覽 printf 的手冊頁,我發生了一些事情。 我想知道這里是否有任何“語言律師”可以回答一個相對簡單的問題:-P。

所以't'修飾符定義為

以下 integer 轉換對應於 ptrdiff_t 參數。

那么,如果將它與無符號integer轉換結合起來會發生什么? 顯然 o,u,x 和 X 都打算被解釋為無符號值,而 d 和 i 是有符號的。

同樣,除了ptrdiff_t之外,所有修飾符(int/unsigned int、 size_t / ssize_t等)都有帶符號/無符號版本。

實際上,沒有什么不好的事情發生,因為類型的無符號版本與有符號版本占用的空間量相同。 所以右邊的字節會從堆棧中彈出。

因此,實際上,在打印除“ INT_MIN ”(假設sizeof(int) == sizeof(ptrdiff_t)之外的所有測試內容的預期值時,不會發生任何“壞事”。

printf("%tu %td\n", INT_MIN, INT_MIN);

印刷

2147483648 -2147483648

在 32 位系統上。

標准對此有何看法? 我認為答案將是“未定義的行為”。 但我想我會問;)。

這沒東西看。 你寫的代碼是合法的。

關於原因的一些事實:

  • 所有簽名的 integer 類型都有未簽名的對應物,具有相同的尺寸/對齊要求
  • ptrdiff_t被標准規定為帶符號的 integer 類型。 因此,它有一個未簽名的雙胞胎。 (事實上,類似的邏輯也適用於size_t - ssize_t不是 C,而是 POSIX)
  • t長度說明符必須與diouxX類型一起使用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM