ChatGPT解决这个技术问题 Extra ChatGPT

size_t 和 unsigned int 之间的区别?

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

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

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

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

typedef /*This part is implementation dependent */ size_t;
unsigned int vs. size_t 的可能重复项

S
Santhosh Kumar

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

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

第二个问题是 size_t 和 unsigned int 是否可以互换,如果不是,那为什么?

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

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

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

奖励:关于 size_there's a good article(以及密切相关的 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 的内存大小(以字节为单位)由编译器决定。编译器(以某种方式)确定最合适的无符号整数数据类型,该数据类型可以容纳架构/硬件可以支持并将其定义为 size_t” - 请验证我的陈述的真实性。
K
Keith Thompson

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

无符号的字符

无符号短

无符号整数

无符号长

无符号长长

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

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 系列,还有旧的英特尔 x86 系列(回到 8086 和 8088)。
K
Keith Thompson

size_t 有特定的限制。

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

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

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


这段话出自哪里? (它不是来自 C 标准。)
问题被标记为 c。 C++ 标准与 C 无关。
E
Ed Heal

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


好点子。 appleapplesize_tsize...
T
Thomas Padron-McCarthy

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


u
user2873459

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_tuintptr_t 是同一类型。
K
Kaushal Billore

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