141

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

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

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

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

4

7 回答 7

115

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

因为unsigned int不是唯一的无符号整数类型。size_t可以是 、 、 或 中的任何一个unsigned charunsigned short具体取决于unsigned int实现。unsigned longunsigned long long

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

由于上述原因,它们不可互换^^

谁能给我一个 size_t 及其简短工作的好例子?

我不太明白你所说的“它的短暂工作”是什么意思。它像任何其他无符号类型一样工作(特别是,就像它被类型化的类型)。size_t当您描述对象的大小时,我们鼓励您使用。特别是sizeof运算符和各种标准库函数,例如strlen()return size_t

奖励:这是一篇关于size_t(以及密切相关的ptrdiff_t类型)的好文章。它很好地解释了为什么你应该使用它。

于 2013-11-01T17:52:19.830 回答
104

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

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

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

size_ttypedef某些无符号类型的(即别名),(可能是上述之一,但可能是扩展的无符号整数类型,尽管这不太可能)。它是运算符产生的类型sizeof

unsigned int在一个系统上,用它来表示尺寸可能是有意义的;unsigned long另一方面,使用or可能更有意义unsigned long long。(size_t不太可能是unsigned charunsigned short,但这是允许的)。

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

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

于 2013-11-01T17:52:19.513 回答
12

size_t有特定的限制。

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

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

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

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

于 2013-11-01T17:51:10.397 回答
9

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

于 2014-10-31T20:06:33.767 回答
7

size_t 用于存储数据对象的大小,并保证能够保存特定 C 实现可以创建的任何数据对象的大小。此数据类型可能更小(位数)、更大或与 unsigned int 完全相同。

于 2013-11-01T17:51:30.267 回答
2

size_t 类型是 C/C++ 语言的基本无符号整数类型。它是 sizeof 运算符返回的结果的类型。选择类型的大小以便它可以存储理论上可能的任何类型数组的最大大小。在 32 位系统上 size_t 将占用 32 位,在 64 位系统上占用 64 位。换句话说,size_t 类型的变量可以安全地存储一个指针。例外是指向类函数的指针,但这是一种特殊情况。尽管 size_t 可以存储一个指针,但最好使用另一个无符号整数类型 uintptr_t 来实现该目的(它的名称反映了它的能力)。size_t 和 uintptr_t 类型是同义词。size_t 类型通常用于循环计数器、数组索引和地址算术。size_t 类型的最大可能值为常量 SIZE_MAX 。

于 2013-11-01T19:00:47.627 回答
2

简单来说 size_t 是平台和实现相关的,而 unsigned int 只是平台相关的。

于 2019-02-25T14:45:19.760 回答