[英]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 位系統上。
標准對此有何看法? 我認為答案將是“未定義的行為”。 但我想我會問;)。
這沒東西看。 你寫的代碼是合法的。
關於原因的一些事實:
ptrdiff_t
被標准規定為帶符號的 integer 類型。 因此,它有一個未簽名的雙胞胎。 (事實上,類似的邏輯也適用於size_t
- ssize_t
不是 C,而是 POSIX)t
長度說明符必須與d
、 i
、 o
、 u
、 x
、 X
類型一起使用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.