size_t和unsigned int之间的区别?


107

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

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

我的第二个问题是:size_tunsigned int互换或不?如果没有,那为什么呢?

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


5
typedef /*This part is implementation dependent */ size_t;
2013年

Answers:


87

如果用于表示非负值,那么为什么不使用unsigned int代替size_t

因为unsigned int不是唯一的无符号整数类型。size_t可以是任意的unsigned charunsigned shortunsigned intunsigned longunsigned long long,取决于实施。

第二个问题是,size_tunsigned int可以互换与否,如果没有,为什么?

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

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

我不太理解“它的简短工作”是什么意思。它的工作方式与其他任何无符号类型一样(尤其是像它被键入的类型一样)。size_t在描述对象的大小时,建议您使用。特别是,sizeof运算符和各种标准库函数,例如strlen()return size_t

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


1
究竟size_tunsigned char多少?这是在允许的标准中吗?我的意思是说那个想法怎么会期望任何人使用calloc()(和家庭使用)strlen()等等?在我看来这很荒谬。
Pryftan

我认为size_t在标准中将其定义为“无符号整数类型”,但不需要与相同 unsigned {char, short, int, long, long long}
Paul Hankin

80

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

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

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

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

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

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

假定sizeof产生的代码unsigned int将不可移植。假定它产生a的代码size_t更可能是可移植的。


6
我认为这应该是公认的答案,因为它说明了为什么您应该使用size_t
kuchi

@基思-汤普森那么,这意味着该特定类型(即unsigned intunsigned long等),其size_t对应于依赖于机器在其上的代码运行?即在一个机器体系结构上,它对应于,unsigned int但在另一种体系结构上,它将对应于unsigned long,等等?
Richie Thomas

1
@RichieThomas:这取决于C的实现。在相同的架构两种不同的编译器可能会选择不同的类型size_t,特别是如果,例如,unsigned longunsigned long long大小相同。
基思·汤普森

@RichieThomas这也是其中的一部分。也就是说longlong long等的最大值确实取决于系统:如果您看一下limits.h,至少会在Unices下看到ints的最大值取决于系统的字长。
Pryftan

1
@Pryftan看一下Motorola 68000系列,也是较旧的Intel x86系列(可追溯到8086和8088)。
基思·汤普森

10

size_t 有特定的限制。

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

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

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

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


5
那报价来自哪里?(它不是C标准的。)
Keith Thompson

2
问题被标记为c。C ++标准与C
无关。– IInspectable

7

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


4

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


好点子。An apple是一个苹果,a size_t是一个大小 ...
dom_beau

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。


1
size_t可以存储任何单个对象的大小。指针可以指向任何对象的任何字节。例如,您可以拥有一个系统,该系统具有一个64位地址空间,该地址空间将任何一个对象的大小限制为2 ** 32-1字节。不能保证size_tuintptr_t是相同的类型。
基思·汤普森

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.