我对size_t
感到很困惑。我在互联网上搜索过,到处都提到 size_t
是无符号类型,因此它只能表示非负值。
我的第一个问题是:如果它只用于表示非负值,我们为什么不使用 unsigned int
而不是 size_t
?
我的第二个问题是:size_t
和 unsigned int
是否可以互换?如果不是,那为什么?
谁能给我一个size_t
的好例子并简要介绍它的工作原理?
typedef /*This part is implementation dependent */ size_t;
如果它用于表示非负值那么为什么我们不使用 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()
)返回 size_t
。
奖励:关于 size_t
的 here's a good article(以及密切相关的 ptrdiff_t
类型)。它很好地解释了为什么你应该使用它。
C中有5种标准的无符号整数类型:
无符号的字符
无符号短
无符号整数
无符号长
无符号长长
对它们的大小和范围有各种要求(简而言之,每种类型的范围都是下一种类型范围的子集,但其中一些可能具有相同的范围)。
size_t
是某些无符号类型的 typedef
(即别名),(可能是上述之一,但也可能是扩展的无符号整数类型,尽管这不太可能)。它是 sizeof
运算符产生的类型。
在一个系统上,使用 unsigned int
表示大小可能是有意义的;另一方面,使用 unsigned long
或 unsigned long long
可能更有意义。 (size_t
不可能是 unsigned char
或 unsigned short
,但这是允许的)。
size_t
的目的是让程序员不必担心哪些预定义类型用于表示大小。
假定 sizeof
产生 unsigned int
的代码将不可移植。假设它产生 size_t
的代码更有可能是可移植的。
size_t
对应的特定类型(即 unsigned int
、unsigned long
等)取决于运行代码的机器?即在一个机器架构上,它对应于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
。
除了其他答案之外,它还记录了代码并告诉人们您正在谈论内存中对象的大小
apple
是 apple,size_t
是 size...
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 只是平台相关的。
size_t
究竟如何成为unsigned char
?这是允许的标准吗?我的意思是这样的想法怎么能指望任何人使用calloc()
(和家人),strlen()
等?在我看来这很荒谬。size_t
在标准中被定义为“无符号整数类型”,但并不要求它与unsigned {char, short, int, long, long long}
中的任何一个相同。unsigned char
作为size_t
。您无需担心size_t
会是什么,编译器会根据目标体系结构来处理它。