总是size_t型无符号?总是size_t型无符号?(is size_t always unsign

2019-05-17 07:13发布

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

Answer 1:

。 它通常被定义为类似下面的(32位系统):

typedef unsigned int size_t;

参考:

C ++标准第18.1节定义size_t是在<cstddef>这是在C标准描述为<stddef.h>
C标准第4.1.5节定义size_t作为无符号整型的结果的sizeof操作者



Answer 2:

根据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的第7描述:1990年和第7 / IEC 9899 /修正案ISO的:1995年以下称为标准C库

关于零件size_t应从ANSI C继承:Frontmatter和部分编号不谈,对于C90和ANSI C标准是相同的。 我需要的规范性章程的修订,以确保没有发现任何有关变更stddef.h ,但我对此表示怀疑。 最小尺寸似乎与介绍stdint.h ,即C99。

也请考虑从C ++ 98款1.2以下报价:

所有标准都会被修订,鼓励各方根据本标准达成协议应探讨使用最新的下列标准版本的可能性。



Answer 3:

是的,size_t会保证是一个无符号类型。



Answer 4:

据它是无符号的标准,但是我记得,一些旧的实现用于的typedef签署的类型。

从旧海合会文档:

有一个与为size_t类型,并释放2.4之前的GCC版本中的潜在问题。 ANSI C要求size_t永远是一个无符号的类型。 为与现有系统的头文件兼容性,GCC定义size_tstddef.h是任何类型的系统的sys/types.h定义的那样。 定义大多数Unix系统size_tsys/types.h ,定义它是一个符号的类型。 在图书馆的一些代码依赖于size_t是无符号的类型,如果是签名的,将无法正常工作

我不知道这将是多么的重要,以防止这一点。 我的代码假定它是无符号。



Answer 5:

在为size_t应遵循相同的定义,C标准,并在C几个地方++标准就意味着它是无符号的Natura(特别是在分配模板参数定义)。

在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。



Answer 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];
}

现在考虑使用情况下改编为空。



文章来源: is size_t always unsigned?
标签: c++ standards