size_t总是未签名?

时间:2009-07-06 20:55:39

标签: c++ standards

作为标题:size_t始终是无符号的,即对于size_t xx总是>= 0

6 个答案:

答案 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为空的用例。

相关问题