size_t 和 unsigned int 之间的区别?
Posted
技术标签:
【中文标题】size_t 和 unsigned int 之间的区别?【英文标题】:Difference between size_t and unsigned int? 【发布时间】:2013-11-12 23:33:55 【问题描述】:我对@987654322@ 感到很困惑。我在网上搜索过,到处都提到size_t
是一个无符号类型,所以它只能表示非负值。
我的第一个问题是:如果它只用于表示非负值,我们为什么不使用unsigned int
而不是size_t
?
我的第二个问题是:size_t
和 unsigned 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 char
、unsigned short
、unsigned int
、unsigned long
或 unsigned long long
中的任何一个,具体取决于实现。
第二个问题是
size_t
和unsigned 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 long
或unsigned long long
可能更有意义。 (size_t
不太可能是 unsigned char
或 unsigned short
,但这是允许的)。
size_t
的目的是让程序员不必担心哪些预定义类型用于表示大小。
假定sizeof
产生unsigned int
的代码将不可移植。假设它产生size_t
的代码更有可能是可移植的。
【讨论】:
我认为这应该是公认的答案,因为它解释了为什么你应该使用 size_t @keith-thompson 那么这是否意味着size_t
对应的具体类型(即unsigned int
、unsigned long
等)取决于运行代码的机器?即在一种机器架构上,它对应于unsigned int
,但在另一种架构上,它将对应于unsigned long
,等等?
@RichieThomas:这取决于 C 实现。同一架构上的两个不同编译器可能会为 size_t
选择不同的类型,尤其是在 unsigned long
和 unsigned long long
大小相同的情况下。
@RichieThomas 这也是其中的一部分。也就是说,long
、long 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】:除了其他答案之外,它还记录了代码并告诉人们您正在谈论内存中对象的大小
【讨论】:
好点。apple
是 apple,size_t
是 size...【参考方案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_t
和uintptr_t
是同一类型。【参考方案7】:
简单来说 size_t 是平台和实现相关的,而 unsigned int 只是平台相关的。
【讨论】:
以上是关于size_t 和 unsigned int 之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章
xcode构建失败隐式转换失去整数精度:'size_t'(又名'unsigned long')到'socklen_t'(又名'unsigned int')