簡體   English   中英

size_t總是未簽名?

[英]is size_t always unsigned?

作為標題:size_t總是無符號的,即對於size_t xx總是>= 0

根據1999 ISO C標准(C99), size_t是至少16位的無符號整數類型(參見第7.17和7.18.3節)。

該標准還建議,如果可能, size_t不應具有大於long的整數轉換等級,即如果遵循建議,則將size_tunsigned long是沒有問題的。

1989 ANSI C標准(ANSI C)未提及最小尺寸或推薦的轉換等級。

1998 ISO C ++標准(C ++ 98)(以及當前的C ++ 0x草案)是指C標准。 第18.1節內容如下:

內容與標准C庫頭文件<stddef.h> [...]相同

根據第1.2節,這意味着1990年ISO C標准(C90)定義的圖書館,包括1995年的第一次修訂(C95):

ISO / IEC 9899:1990的第7節中描述的庫和ISO / IEC 9899 / Amd.1:1995的第7節在下文中稱為標准C庫

關於size_t的部分應該繼承自ANSI C:Frontmatter和部分編號,C90和ANSI C的標准是相同的。 我需要一份規范性修正案的副本,以確保stddef.h沒有任何相關的變化,但我對此表示懷疑。 最小的大小似乎是用stdint.h引入的,即C99。

還請考慮C ++ 98第1.2節中的以下引用:

所有標准都可以修訂,鼓勵根據本國際標准達成協議的各方研究是否可以應用下列標准的最新版本。

是的 通常被定義為類似以下內容(在32位系統上):

typedef unsigned int size_t;

參考:

C ++標准第18.1節定義size_t<cstddef> ,在C標准中描述為<stddef.h>
C標准第4.1.5節將size_t定義為sizeof運算符結果的無符號整數類型

是的,size_t保證是無符號類型。

根據標准,它是無符號的,但我記得一些較舊的實現使用了帶有簽名類型的typedef。

來自較舊的GCC文檔:

在版本2.4之前,size_t類型和GCC版本存在潛在問題。 ANSI C要求size_t始終是無符號類型。 為了與現有系統的頭文件兼容,GCC將stddef.h size_t定義為系統的sys/types.h定義的類型。 大多數在sys/types.h中定義size_t Unix系統將其定義為有符號類型。 庫中的某些代碼依賴於size_t是無符號類型,如果簽名則無法正常工作

我不確定防范這一點有多重要。 我的代碼假定它是未簽名的。

size_t應該遵循與C標准相同的定義,並且在C ++標准中的幾個地方它暗示它是無符號的natura(特別是在allocator模板參數定義中)。

在C ++標准中,第18.1節(ISO / IEC 14882 - 第一版1998-01-01):

表15列出了定義的類型:ptrdiff_t和size_t

3內容與標准C庫頭相同,但有以下更改:4宏NULL是本國際標准(4.10)中實現定義的C ++空指針常量。

宏offsetof在本國際標准中接受一組受限制的類型參數。 type應為POD結構或POD聯合(第9條)。 將offsetof宏應用於作為靜態數據成員或函數成員的字段的結果是未定義的。 還請參見:子條款5.3.3,Sizeof,子條款5.7,附加運算符,子條款12.5,自由存儲和ISO C子條款7.1.6。

哦,這太糟糕了:

vector<MyObject> arr;
Fill(arr);
size_t size = arr.size();
for(size_t i = 1; i < size - 1; ++i)
{
  auto obj = arr[i];
  auto next = arr[i+1];
}

現在考慮arr為空的用例。

暫無
暫無

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

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