我对 size_t
非常困惑。在互联网上搜索后,无论何处都提到 size_t
是一种无符号类型,因此只能表示非负值。
我的第一个问题是:如果它仅用于表示非负值,为什么我们不使用 unsigned int
而是使用 size_t
?
我的第二个问题是: size_t
和 unsigned int
可互换吗?如果不能,那么为什么?
还有人能否给我一个好的 size_t
的例子,并简要解释其工作原理?
我对 size_t
非常困惑。在互联网上搜索后,无论何处都提到 size_t
是一种无符号类型,因此只能表示非负值。
我的第一个问题是:如果它仅用于表示非负值,为什么我们不使用 unsigned int
而是使用 size_t
?
我的第二个问题是: size_t
和 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
。
额外福利:这里有一篇好文章关于size_t
(以及密切相关的ptrdiff_t
类型)。它很好地解释了为什么应该使用它。
size_t
怎么可能是unsigned char
?这在标准中被允许吗?我的意思是,如果是这样的话,任何人都如何能够使用calloc()
(以及相关函数)、strlen()
等?这对我来说似乎是荒谬的。 - Pryftansize_t
在标准中被定义为“无符号整数类型”,但不要求它与任何unsigned {char, short, int, long, long long}
相同。 - Paul Hankinunsigned char
作为size_t
。你不需要担心size_t
会是什么,编译器会根据目标架构来处理它。 - Ekrem DinçelC语言中有5种标准的无符号整数类型:
unsigned char
(无符号字符型)unsigned short
(无符号短整型)unsigned int
(无符号整型)unsigned long
(无符号长整型)unsigned long long
(无符号长长整型)它们的大小和范围各异(简单来说,每个类型的范围都是下一个类型范围的子集,但其中一些类型的范围可能相同)。
size_t
是一个typedef(即别名),代表了某个无符号类型(可能是上述某个类型或扩展的无符号整数类型,但这不太可能)。它是由sizeof
运算符得出的类型。
在某个系统上,使用 unsigned int
来表示大小可能是最合适的;在另一个系统上,使用 unsigned long
或 unsigned long long
可能更合适。(但size_t
不太可能是 unsigned char
或 unsigned short
,但也是允许的。)
size_t
的目的是为了让程序员不必担心使用哪种预定义类型来表示大小。
假设sizeof
产生的是unsigned int
的代码将不可移植。而假设它产生的是size_t
的代码更可能是可移植的。
size_t
对应的具体类型(例如 unsigned int
、unsigned long
等)取决于运行代码的机器?也就是说,在一种机器架构上,它对应于 unsigned int
,但在另一种架构上,它将对应于 unsigned long
等等? - Richie Thomassize_t
选择不同的类型,特别是如果例如unsigned long
和unsigned long long
大小相同。 - Keith Thompsonsize_t
有一个特定的限制。
引用自http://www.cplusplus.com/reference/cstring/size_t/ :
是一个基本无符号整数类型的别名。
它是一种能够以字节为单位表示任何对象大小的类型:size_t是sizeof运算符返回的类型,广泛用于标准库中表示大小和计数。
它不能与unsigned int
互换,因为int
的大小由数据模型指定。例如,LLP64使用32位int
,而ILP64使用64位int
。
除了其他答案之外,它还记录了代码并告诉人们您正在谈论对象在内存中的大小。
apple
是一个 _apple_,一个 size_t
是一个 size... - dom_beausize_t被用来存储数据对象的大小,并且能够保证存储任何特定C实现所创建的数据对象的大小。这种数据类型可能比unsigned int类型更小(以位数计算),更大或者恰好相同。
简单来说,size_t是与平台和实现相关的,而unsigned int仅与平台有关。
"最初的回答"的原意是Original Answer。
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。
size_t
可以存储任何单个对象的大小。指针可以指向任何对象的任何字节。例如,您可以拥有一个具有 64 位地址空间的系统,它将任一对象的大小限制为 2**32-1 字节。不能保证 size_t
和 uintptr_t
是相同类型。 - Keith Thompson