我对 size_t很困惑。我在互联网上搜索,到处都提到 size_t是一个无符号类型,所以它只能代表非负值。
size_t
我的第一个问题是: 如果它仅用于表示非负值,为什么我们不使用 unsigned int而不是 size_t?
unsigned int
我的第二个问题是: size_t和 unsigned int是否可以互换? 如果不可以,为什么?
谁能给我举一个 size_t的好例子,简要介绍一下它的工作原理?
size_t有一个特定的限制。
引自 http://www.cplusplus.com/reference/cstring/size_t/:
基本无符号整数类型之一的别名。 它是一种能够以字节 表示任何对象的大小的类型: size _ t 是 sizeof 运算符返回的类型,在标准库中广泛用于表示大小和计数。
基本无符号整数类型之一的别名。
它是一种能够以字节 表示任何对象的大小的类型: size _ t 是 sizeof 运算符返回的类型,在标准库中广泛用于表示大小和计数。
它不能与 unsigned int互换,因为 int的大小是由数据模型指定的。例如,LLP64使用32位 int,ILP64使用64位 int。
int
Size _ t 用于存储数据对象的大小,并保证能够保存特定 C 实现可以创建的任何数据对象的大小。这种数据类型可能更小(以位数为单位) ,也可能更大,或者与无符号 int 完全相同。
C 语言中有5种标准的无符号整数类型:
unsigned char
unsigned short
unsigned long
unsigned long long
对它们的大小和范围有不同的要求(简而言之,每种类型的范围是下一种类型的范围的子集,但其中一些可能具有相同的范围)。
size_t是某种无符号类型的 typedef(即别名)(可能是上述类型之一,但也可能是 扩展的无符号整数类型,尽管这种可能性不大)。它是由 sizeof操作符生成的类型。
typedef
sizeof
在一个系统上,使用 unsigned int表示大小可能是有意义的; 在另一个系统上,使用 unsigned long或 unsigned long long可能更有意义。(size_t不太可能是 unsigned char或 unsigned short,但这是允许的)。
size_t的目的是使程序员不必担心使用预定义类型表示大小的 哪个。
假定 sizeof产生 unsigned int的代码将不可移植。假设它产生 size_t的代码更有可能是可移植的。
如果它是用来表示非负值,那么为什么我们不使用 unsigned int代替 size_t
因为 unsigned int不是唯一的无符号整数类型。根据实现的不同,size_t可以是 unsigned char、 unsigned short、 unsigned int、 unsigned long或 unsigned long long中的任何一个。
第二个问题是 size_t和 unsigned int是否可以互换,如果不可以,为什么?
它们是不可互换的,原因在 ^^上面已经解释过了。
^^
有人能给我一个 size _ t 及其简单工作的好例子吗?
我不太明白你说的“短暂工作”是什么意思。它的工作原理与其他任何无符号类型一样(特别是与它被定义为的类型一样)。建议您在描述对象的大小时使用 size_t。特别是,sizeof运算符和各种标准库函数(如 strlen())返回 size_t。
strlen()
奖励: 这篇文章不错关于 size_t(和密切相关的 ptrdiff_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 只是平台相关的。