我很困惑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
并简要介绍一下它的工作原理?
Answers:
如果用于表示非负值,那么为什么不使用
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()
return size_t
。
size_t
是unsigned char
多少?这是在允许的标准中吗?我的意思是说那个想法怎么会期望任何人使用calloc()
(和家庭使用)strlen()
等等?在我看来这很荒谬。
size_t
在标准中将其定义为“无符号整数类型”,但不需要与相同 unsigned {char, short, int, long, long long}
。
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
将不可移植。假定它产生a的代码size_t
更可能是可移植的。
unsigned int
,unsigned long
等),其size_t
对应于依赖于机器在其上的代码运行?即在一个机器体系结构上,它对应于,unsigned int
但在另一种体系结构上,它将对应于unsigned long
,等等?
size_t
,特别是如果,例如,unsigned long
和unsigned long long
大小相同。
long
,long long
等的最大值确实取决于系统:如果您看一下limits.h
,至少会在Unices下看到ints的最大值取决于系统的字长。
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实现可以创建的任何数据对象的大小。此数据类型可以更小(以位数为单位),更大或与unsigned int完全相同。
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
是相同的类型。
用简单的话来说,size_t取决于平台和实现,而unsigned int仅取决于平台。
typedef /*This part is implementation dependent */ size_t;