我对size_t
感到困惑。我在互联网上搜索过,到处都提到size_t
是无符号类型,所以它只能表示非负值。
我的第一个问题是:如果它仅用于表示非负值,为什么我们不使用unsigned int
代替size_t
?
我的第二个问题是:size_t
和unsigned int
可以互换吗?如果没有,那么为什么?
任何人都可以给我一个size_t
的好例子并简要说明它的工作原理吗?
答案 0 :(得分:67)
如果用于表示非负值,那么为什么我们不使用
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及其简短工作的好例子吗?
我的“简短工作”并不能说明你的意思。它的工作方式与任何其他无符号类型一样(特别是类似于typedeffed的类型)。在描述对象的大小时,建议您使用size_t
。特别是,sizeof
运算符和各种标准库函数(例如strlen()
)返回size_t
。
奖励:here's a good article关于size_t
(以及密切相关的ptrdiff_t
类型)。这很好地说明了为什么要使用它。
答案 1 :(得分:55)
C中有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
的代码更可能是可移植的。
答案 2 :(得分:8)
size_t
有特定的限制。
引自http://www.cplusplus.com/reference/cstring/size_t/:
其中一个基本无符号整数类型的别名。
这是一种能够以字节为单位表示任何对象大小的类型:size_t是sizeof运算符返回的类型,在标准库中广泛用于表示大小和计数。
它与unsigned int
不可互换,因为int
的大小由数据模型指定。例如,LLP64使用32位int
,ILP64使用64位int
。
答案 3 :(得分:5)
size_t用于存储数据对象的大小,并保证能够保存特定C实现可以创建的任何数据对象的大小。此数据类型可能比unsigned int更小(位数),更大或完全相同。
答案 4 :(得分: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。
答案 5 :(得分:2)
除了其他答案之外,它还会记录代码并告诉人们你在谈论内存中对象的大小
答案 6 :(得分:0)
简单地说,size_t与平台和实现有关,而unsigned int仅与平台有关。