size_t和unsigned int之间的区别?

时间:2013-11-01 17:47:34

标签: c types unsigned

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

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

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

任何人都可以给我一个size_t的好例子并简要说明它的工作原理吗?

7 个答案:

答案 0 :(得分:67)

  

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

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

  

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

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

  

任何人都可以给我一个关于size_t及其简短工作的好例子吗?

我的“简短工作”并不能说明你的意思。它的工作方式与任何其他无符号类型一样(特别是类似于typedeffed的类型)。在描述对象的大小时,建议您使用size_t。特别是,sizeof运算符和各种标准库函数(例如strlen())返回size_t

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

答案 1 :(得分:55)

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

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

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

对于某些无符号类型,

size_ttypedef(即别名),(可能是上面的一个但可能是扩展无符号整数类型,但这不太可能)。它是sizeof运算符产生的类型。

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

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

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

答案 2 :(得分:8)

size_t有特定的限制。

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

  

其中一个基本无符号整数类型的别名。

     

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

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

答案 3 :(得分:5)

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

答案 4 :(得分: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。

答案 5 :(得分:2)

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

答案 6 :(得分:0)

简单地说,size_t与平台和实现有关,而unsigned int仅与平台有关。