size_t总是未签名?

pet*_*hen 59 c++ standards

标题:size_t总是无符号的,即for size_t x,x总是>= 0

Chr*_*oph 51

根据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节中的以下引用:

所有标准都可以修订,鼓励根据本国际标准达成协议的各方研究是否可以应用下列标准的最新版本.

  • @Neil,他必须采用C标准,因为C++标准代表它:)它本身并不定义size_t :) (8认同)
  • 是的,但C++标准没有引用C99标准. (2认同)
  • 它说它引用了C99,但对于库,它指的是C90和C95.在1.2/2中它说"在... C90和...... C95中描述的库在这里被称为'标准C库'".因此,当它指定cstddef的内容时,它指的是C89(和修订C95,它是TC到C89 afaik.也是C++ 03到C++ 98)(另一个时间由17.4.1.2/4指定) ) (2认同)

Meh*_*ari 49

是的.它通常被定义为类似以下内容(在32位系统上):

typedef unsigned int size_t;
Run Code Online (Sandbox Code Playgroud)

参考:

C++标准第18.1节定义的size_t内容<cstddef>在C标准中描述为<stddef.h>.
C标准第4.1.5节定义size_tsizeof运算符结果的无符号整数类型

  • 请注意,`size_t`在64位系统上通常是64位,而`int`可能仍然是32位; 这些东西是高度编译器特定的 (9认同)
  • 感谢mehrdad追捕参考 (2认同)
  • @litb:C++2003, 27.6.2.5.2 定义了这些签名。请注意,第一个块是成员函数(因此不是第一个 basic_ostream&amp; 参数),而最后一个块是自由函数。@Mehrdad:C++2003, 5.3.4 par 10:一个新表达式将请求的空间量传递给分配函数作为 std::size_t 类型的第一个参数,同 http://www.cplusplus.com/reference/std/new/operator%20new/ (2认同)

nos*_*nos 14

是的,size_t保证是无符号类型.


Mic*_*urr 5

根据标准,它是无符号的,但我记得一些较旧的实现使用了带有签名类型的typedef.

来自较旧的GCC文档:

在版本2.4之前,size_t类型和GCC版本存在潜在问题.ANSI C要求size_t始终为无符号类型.为了与现有的系统的头文件兼容性,GCC限定size_tstddef.h为任何类型系统的sys/types.h定义的那样.定义大多数Unix系统size_tsys/types.h,定义它是一个符号的类型.库中的某些代码依赖于size_t无符号类型,如果签名则无法正常工作

我不确定防范这一点有多重要.我的代码假定它是未签名的.