size_t总是unsigned int

时间:2015-11-07 16:37:57

标签: c++ size-t

是否有任何将size_t定义为除unsigned int以外的其他内容的实现?在我工作的每个系统下,它被定义为unsigned int,所以我只是好奇。

7 个答案:

答案 0 :(得分:5)

x86-64和aarch64(arm64)Linux,OS X和iOS都size_t最终定义为unsigned long。 (这是LP64模型。这种事情是平台的ABI的一部分,它也定义了诸如函数调用约定之类的东西。其他架构可能会有所不同。)甚至32位x86和ARM体系结构也使用unsigned long操作系统虽然long在这些情况下恰好与int表示相同。

我很确定它在Win64上是unsigned __int64 / unsigned long long。 (使用LLP64模型)

答案 1 :(得分:4)

没有。但它是一个无符号的整数类型。它不一定是 int

对于C ++

http://en.cppreference.com/w/cpp/types/size_t

C ++标准secton 18.2.6

  

类型size_t是实现定义的无符号整数类型   它足够大,可以包含任何对象的字节大小。

对于linux; “Where is c++ size_t defined in linux”提供long unsigned int

对于C

(这个问题最初被标记为C和C ++。)

看看这里的答案:

What's sizeof(size_t) on 32-bit vs the various 64-bit data models?

答案 2 :(得分:2)

不,它是无符号整数类型(不是unsigned int)。来自CPPReference

  

std :: size_t是sizeof结果的无符号整数类型   操作

但你不能确切地说它的大小是什么,我想这取决于平台。

答案 3 :(得分:2)

绝对无保修 size_t被定义为任何"具体"类型。实际上,如果你想看到一个不是unsigned int的系统,请参阅我的机器(unsigned long),以及大多数64位GNU / Linux系统。

从N4296,第18.2.6节:

  

类型size_t是一个实现定义的无符号整数类型,其大小足以包含任何对象的大小字节。

另外,来自N897(理由)6.5.3.4 ......

  

sizeof的类型,无论它是什么,都会发布(在库中)   标题<stddef.h>)为size_t,因为它对程序员有用   能够参考这种类型。隐含地要求这个要求   将size_t限制为现有无符号整数的同义词   类型。另请注意,虽然size_t是无符号类型,但sizeof   不涉及任何算术运算或转换   如果尺寸太大而不能表示为a,则会导致模数行为   size_t,从而消除了最大可申报的概念   即使在C89或{C}中使用unsigned long,对象也可能太大而无法跨越   C9X中的uintmax_t。这也限制了元素的最大数量   可以在数组中声明,因为a的任何数组N   元素,

     

N == sizeof(a)/sizeof(a[0])

     

因此size_t对于数组大小来说也是一种方便的类型,因此在几个库函数中使用。

答案 4 :(得分:1)

来自fiddle

  

size_t应为无符号整数类型。

至少从理论上讲,它可能是未签名的shortintlonglong long

答案 5 :(得分:1)

没有。 ValueAnimator anim = ValueAnimator.ofInt(0, width); anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { viewGroup.setMinimumWidth((Integer) valueAnimator.getAnimatedValue()); } }); anim.setDuration(duration).start(); 可以而且确实与size_t不同。

根据C standard, 6.5.3.4

  

两个运算符的结果值是实现定义的,   它的类型(无符号整数类型)是unsigned int,定义于   size_t(以及其他标题)。

在C标准下,<stddef.h>是未定义的无符号整数类型。

根据Open Group (POSIX, etc)

  

64位和数据大小中立

     

...

     

sizeof(char)&lt; = sizeof(short)&lt; = sizeof(int)&lt; = sizeof(long)=   的sizeof(为size_t)

简单地说:

size_t size_t。不符合规定的代码是错误的。

答案 6 :(得分:0)

没有。我刚刚在cpp.sh上运行了这个程序,这是gcc:

#include <iostream>

int main()
{
  std::cout << sizeof(unsigned int) << " " << sizeof(unsigned long) << " " << sizeof(size_t) << "\n";
}

并产生此输出:

4 8 8