![](/img/trans.png)
[英]Why size of QByteArray is `int` rather than `unsigned int`
[英]Why is argc an 'int' (rather than an 'unsigned int')?
為什么命令行參數 count 變量(傳統上是argc
)是int
而不是unsigned int
? 這有技術原因嗎?
在嘗試消除所有簽名的未簽名比較警告時,我總是忽略它,但從未理解為什么會這樣。
事實上,原始 C 語言在默認情況下任何變量或參數都被定義為 int 類型,這可能是另一個因素。 換句話說,您可以擁有:
main(argc, char* argv[]); /* see remark below... */
而不是
int main(int argc, char *argv[]);
編輯:有效地,正如 Aaron 提醒我們的那樣,非常原始的語法應該是這樣的
main(argc, argv) char **argv {... }
由於“原型”是后來才推出的。 這大概是在每個人至少記錄了至少 10 個小時以追蹤與類型相關的微妙(而不是那么微妙)的錯誤之后發生的
幾個原因:
unsigned
關鍵字或無符號整數類型int
類型,因為這是默認值。int
更重要。 一切都是一個整數。 C 部分是從一種甚至沒有類型的語言演變而來的。 每個變量都是一個word
,這就是int
最初的用途。更新: Jason S詢問消息來源。 我認為您可以從dmr 的在線論文中挖掘所有這些(除了“無關緊要”): The Development of the C Language 。 您可能需要在通常的地方查找較早的語言 BCPL 和 B。
因為 C 很老,而且它從一開始就是這樣設計的。 現在改變它為時已晚。
另一個原因可能是無符號類型不方便迭代。 例如,此代碼段向下迭代:
for (size_t i = SIZE - 1; i >= 0; --i)
...
事實上,這是一個錯誤。 當 i 在最后一次迭代中達到 0 時,它將直接進入 4294967295(在 32 位機器上)並且循環不會終止。
出於這個原因,我個人認為普通整數更便於迭代。 使用整數時,當您將for
循環從向上計數切換到向下計數時,您不必特別小心。
Google C++ Style Guide建議不要使用unsigned int
類型,除非您正在使用實際的位模式。 它們的基本原理也適用於 C。 快速總結行:
... C 的類型提升方案導致無符號類型的行為與人們預期的不同。 ... 不要使用無符號類型。
這可能不是 C 的原始創造者的想法,但誰知道呢‽
作為警告問題的解決方案,您可以執行以下操作來抑制警告:
const unsigned int uargc = (unsigned int) argc;
由於 Java 中沒有無符號類型,因此將來可以更輕松地將 C 程序移植到 Java,這是一個有先見之明的設計決策。
main()
的聲明是在將無符號類型添加到語言之前定義的 - 請參閱 DMR 上的“原始 C ”頁面。 添加 unsigned 時,更改為時已晚。
我明白這看起來很奇怪: argc
不應該是負數! 但是這樣看: int
和unsigned int
涵蓋了您可以接受的值范圍(如果您有 2^31 個命令行參數,則有問題)並且int
鍵入更短。
面試難題:如果 C 和unsigned int argc
一起使用,輸入unsigned
鍵盤會用完多少?
通過將其設置為 int,范圍被限制在 1 和 INT_MAX 之間。 這通常意味着沒有意外的轉換或別名會將其從無意的環繞中移出范圍。 它還允許實現將整個負和 0 范圍用於系統特定場景。
好吧,我剛剛編的。 真正的原因是,這只是一個原始 C 語言開發人員做出的任意決定,直到現在還沒有人真正認真考慮過。 :)
只是一個簡單的問題:您是否期望超過 2 31 個(甚至超過 2 15 個)命令行參數? 我懷疑大多數操作系統能否處理這么多。
我想它被設計為與 C 兼容,在 C 時代,人們並不太關心有符號/無符號的正確性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.