作为标题:size_t始终是无符号的,即对于size_t x
,x
总是>= 0
?
答案 0 :(得分:51)
根据1999 ISO C标准(C99),size_t
是一个至少为16位的无符号整数类型(见7.17和7.18.3节)。
标准还建议size_t
如果可能的话,整数转化次数不应超过long
,例如,如果建议是size_t
,那么将unsigned long
转换为<stddef.h>
是没有问题的接着
1989 ANSI C标准(ANSI C)未提及最小尺寸或建议的转换等级。
1998 ISO C ++标准(C ++ 98)(以及当前的C ++ 0x草案)是指C标准。第18.1节内容如下:
内容与标准C库标题
相同size_t
[...]
根据第1.2节,这意味着1990年ISO C标准(C90)定义的图书馆,包括1995年的第一次修订(C95):
第7条所述的图书馆 ISO / IEC 9899:1990和第7条 ISO / IEC 9899 / Amd.1:1995在下文中 称为标准C库。
关于stddef.h
的部分应该继承自ANSI C:Frontmatter和部分编号,C90和ANSI C的标准是相同的。我需要一份规范性修正案,以确保stdint.h
没有任何相关变化,但我对此表示怀疑。最小尺寸似乎是用{{1}}引入的,即C99。
请同时考虑C ++ 98第1.2节中的以下引用:
所有标准均可修订, 和基于协议的各方 这个国际标准是 鼓励调查 应用最多的可能性 最新版本的标准 如下所示。
答案 1 :(得分:48)
是即可。它的通常定义如下(在32位系统上):
typedef unsigned int size_t;
参考:
C ++标准第18.1节定义size_t
位于<cstddef>
中,在C标准中描述为<stddef.h>
。
C标准第4.1.5节将size_t
定义为sizeof
运算符结果的无符号整数类型
答案 2 :(得分:14)
是的,size_t保证是无符号类型。
答案 3 :(得分:5)
根据标准它是无符号的,但我记得一些较旧的实现使用了typedef的signed类型。
来自较旧的GCC文档:
版本2.4之前的size_t类型和GCC版本可能存在问题。 ANSI C要求
size_t
始终是无符号类型。为了与现有系统的头文件兼容,GCC将size_t
中的stddef.h
定义为系统sys/types.h
定义它的任何类型。大多数在size_t
中定义sys/types.h
的Unix系统将其定义为签名类型。库中的某些代码取决于size_t
是无符号类型,如果签名则无法正常工作
我不确定防范这一点有多重要。我的代码假定它是未签名的。
答案 4 :(得分:2)
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在本国际标准中接受一组受限制的类型参数。类型 应为POD结构或POD联合(第9条)。将offsetof宏应用于该字段的结果 是静态数据成员或函数成员未定义。 还请参见:子条款5.3.3,Sizeof,子条款5.7,附加运算符,子条款12.5,自由存储和ISO C子条款7.1.6。
答案 5 :(得分:2)
哦,这太糟糕了:
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为空的用例。