Size_t 与无符号整型之间的区别?

我对 size_t很困惑。我在互联网上搜索,到处都提到 size_t是一个无符号类型,所以它只能代表非负值。

我的第一个问题是: 如果它仅用于表示非负值,为什么我们不使用 unsigned int而不是 size_t

我的第二个问题是: size_tunsigned int是否可以互换? 如果不可以,为什么?

谁能给我举一个 size_t的好例子,简要介绍一下它的工作原理?

93069 次浏览

size_t有一个特定的限制。

引自 http://www.cplusplus.com/reference/cstring/size_t/:

基本无符号整数类型之一的别名。

它是一种能够以字节 表示任何对象的大小的类型: size _ t 是 sizeof 运算符返回的类型,在标准库中广泛用于表示大小和计数。

它不能与 unsigned int互换,因为 int的大小是由数据模型指定的。例如,LLP64使用32位 int,ILP64使用64位 int

Size _ t 用于存储数据对象的大小,并保证能够保存特定 C 实现可以创建的任何数据对象的大小。这种数据类型可能更小(以位数为单位) ,也可能更大,或者与无符号 int 完全相同。

C 语言中有5种标准的无符号整数类型:

  • unsigned char
  • unsigned short
  • unsigned int
  • unsigned long
  • unsigned long long

对它们的大小和范围有不同的要求(简而言之,每种类型的范围是下一种类型的范围的子集,但其中一些可能具有相同的范围)。

size_t是某种无符号类型的 typedef(即别名)(可能是上述类型之一,但也可能是 扩展的无符号整数类型,尽管这种可能性不大)。它是由 sizeof操作符生成的类型。

在一个系统上,使用 unsigned int表示大小可能是有意义的; 在另一个系统上,使用 unsigned longunsigned long long可能更有意义。(size_t不太可能是 unsigned charunsigned short,但这是允许的)。

size_t的目的是使程序员不必担心使用预定义类型表示大小的 哪个

假定 sizeof产生 unsigned int的代码将不可移植。假设它产生 size_t的代码更有可能是可移植的。

如果它是用来表示非负值,那么为什么我们不使用 unsigned int代替 size_t

因为 unsigned int不是唯一的无符号整数类型。根据实现的不同,size_t可以是 unsigned charunsigned shortunsigned intunsigned longunsigned long long中的任何一个。

第二个问题是 size_tunsigned int是否可以互换,如果不可以,为什么?

它们是不可互换的,原因在 ^^上面已经解释过了。

有人能给我一个 size _ t 及其简单工作的好例子吗?

我不太明白你说的“短暂工作”是什么意思。它的工作原理与其他任何无符号类型一样(特别是与它被定义为的类型一样)。建议您在描述对象的大小时使用 size_t。特别是,sizeof运算符和各种标准库函数(如 strlen())返回 size_t

奖励: 这篇文章不错关于 size_t(和密切相关的 ptrdiff_t类型)。它很好地说明了为什么你应该使用它。

Size _ t 类型是基无符号整数类型 C/C + + 语言。它是结果的类型 由 sizeof 运算符返回。该类型的大小为 所以它可以存储最大的大小 任何类型的理论上可能的数组 32位系统 size _ t 在64-上需要32位 位一64位。换句话说,一个变量 Size _ t 类型可以安全地存储指针 例外是指向类函数的指针 虽然 size _ t 可以存储 指针,则最好使用另一个无符号 整数类型 uintptr _ t 类型 size _ t 和 Uintptr _ t 是同义词 通常用于循环计数器、数组索引 和地址算术。 Size _ t 类型的最大可能值为 常数 SIZE _ MAX。

除了其他的答案之外,它还记录了代码,并告诉人们你在讨论内存中对象的大小

简单地说,size _ t 是平台和实现相关的,而 unsignedint 只是平台相关的。