size_t 和 unsigned int 之间的区别?

Posted

技术标签:

【中文标题】size_t 和 unsigned int 之间的区别?【英文标题】:Difference between size_t and unsigned int? 【发布时间】:2013-11-12 23:33:55 【问题描述】:

我对@9​​87654322@ 感到很困惑。我在网上搜索过,到处都提到size_t 是一个无符号类型,所以它只能表示非负值。

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

我的第二个问题是:size_tunsigned int 是否可以互换?如果不是,那为什么?

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

【问题讨论】:

typedef /*This part is implementation dependent */ size_t; unsigned int vs. size_t 的可能重复项 【参考方案1】:

如果它用于表示非负值,那么为什么我们不使用unsigned int 而不是size_t

因为unsigned int 不是唯一的无符号整数类型。 size_t 可以是 unsigned charunsigned shortunsigned intunsigned longunsigned long long 中的任何一个,具体取决于实现。

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

由于上述^^ 解释的原因,它们不可互换。

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

我不太明白你所说的“它的短暂工作”是什么意思。它像任何其他无符号类型一样工作(特别是,就像它被类型化的类型)。当您描述对象的大小时,我们鼓励您使用size_t。特别是sizeof 运算符和各种标准库函数,如strlen(),返回size_t

奖励:here's a good article 约 size_t(以及密切相关的 ptrdiff_t 类型)。它很好地说明了为什么要使用它。

【讨论】:

size_t 究竟如何成为unsigned char?这是允许的标准吗?我的意思是这样的想法怎么可能有人使用calloc()(和家人),strlen()等?在我看来这很荒谬。 我认为size_t在标准中被定义为“无符号整数类型”,但并不要求它与unsigned char, short, int, long, long long中的任何一个相同。 @Pryftan,例如 8 位架构将使用 unsigned char 作为 size_t。你不必担心size_t 会是什么,编译器会根据目标架构来处理它。 "size_t 的内存大小(以字节为单位)由编译器决定。编译器(不知何故)确定最合适的无符号整数数据类型,它可以容纳最大可能的数组大小(1 字节/最小内存单元)架构/硬件可以支持并将其定义为 size_t" - 请验证我的陈述的真实性。【参考方案2】:

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

unsigned char unsigned short unsigned int unsigned long unsigned long long

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

size_t 是某些无符号类型的typedef(即别名),(可能是上述类型之一,但也可能是扩展的无符号整数类型,尽管这不太可能)。它是sizeof 运算符产生的类型。

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

size_t 的目的是让程序员不必担心哪些预定义类型用于表示大小。

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

【讨论】:

我认为这应该是公认的答案,因为它解释了为什么你应该使用 size_t @keith-thompson 那么这是否意味着size_t对应的具体类型(即unsigned intunsigned long等)取决于运行代码的机器?即在一种机器架构上,它对应于unsigned int,但在另一种架构上,它将对应于unsigned long,等等? @RichieThomas:这取决于 C 实现。同一架构上的两个不同编译器可能会为 size_t 选择不同的类型,尤其是在 unsigned longunsigned long long 大小相同的情况下。 @RichieThomas 这也是其中的一部分。也就是说,longlong long 等的最大值确实取决于系统:如果你看一下limits.h,你至少会在 Unices 下看到 ints 的最大值取决于字长系统的。 @Pryftan 看看摩托罗拉 68000 系列,还有旧的 Intel x86 系列(回到 8086 和 8088)。【参考方案3】:

size_t 有特定的限制。

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

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

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

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

【讨论】:

那句话出自哪里? (它不是来自 C 标准。) 问题被标记为c。 C++ 标准与 C 无关。【参考方案4】:

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

【讨论】:

好点。 appleapplesize_tsize...【参考方案5】:

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

【讨论】:

【参考方案6】:

size_t 类型是基本无符号整数类型 C/C++ 语言。它是结果的类型 由 sizeof 运算符返回。类型的大小是 选择以便它可以存储最大大小 理论上可能的任何类型的数组。在一个 32 位系统 size_t 将占用 32 位,在 64- 位 1 64 位。换句话说,一个变量 size_t 类型可以安全地存储一个指针。这 异常是指向类函数的指针,但这 是一个特例。虽然 size_t 可以存储一个 指针,最好使用另一个无符号的 用于该目的的整数类型 uintptr_t(其名称 反映了它的能力)。类型 size_t 和 uintptr_t 是同义词。 size_t 类型是 通常用于循环计数器、数组索引 和地址算术。 size_t 类型的最大可能值为 常量 SIZE_MAX 。

【讨论】:

size_t 可以存储任何单个对象的大小。指针可以指向任何对象的任何字节。例如,您可以拥有一个具有 64 位地址空间的系统,该地址空间将任何一个对象的大小限制为 2**32-1 个字节。不保证size_tuintptr_t 是同一类型。【参考方案7】:

简单来说 size_t 是平台和实现相关的,而 unsigned int 只是平台相关的。

【讨论】:

以上是关于size_t 和 unsigned int 之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

unsigned int 与 size_t

xcode构建失败隐式转换失去整数精度:'size_t'(又名'unsigned long')到'socklen_t'(又名'unsigned int')

c size_t

没有匹配函数调用‘std::set<unsigned int>::insert(std::size_t&)

size_t 和 size_type的区别

size_t, ptrdiff_t, size_type, difference_type