size_t是否总是无符号整数

4

有没有将 size_t 定义为除了 unsigned int 以外的其他类型的实现?在我工作过的每个系统中,它都被定义为 unsigned int,所以我只是好奇。


3
我的理解是,这个类型并不是“保证”为unsigned int,因此被称为 size_t。它是某些特定的C库调用所期望的一种类型,用于定义一个大小参数(例如缓冲区的长度)。即使你从未见过它以外的定义,也不要编写假定它是unsigned int的代码。 - lurker
1
请在C和C++中选择一个。 - fuz
7个回答

6
x86-64和aarch64(arm64)的Linux,OS X和iOS都将size_t定义为unsigned long。(这是LP64模型。这种事情是平台的ABI的一部分,该ABI还定义了诸如函数调用约定等内容。其他架构可能会有所不同。)即使在这些操作系统上使用32位x86和ARM架构,也会使用unsigned long,虽然在这种情况下long恰好与int具有相同的表示形式。
我相当确定Win64使用unsigned __int64/unsigned long long。(它使用LLP64模型)

5

2
并非所有的无符号整数都是“unsigned int”。 - jwodder

3

不能保证 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 不涉及任何算术操作或转换,即使大小过大而无法表示为 size_t,也不会导致模数行为,从而扼杀了最大可声明对象可能过大以至于 C89 中需要使用 unsigned long 或 C9X 中需要使用 uintmax_t 来跨越的任何概念。这也限制了可以在数组中声明的最大元素数量,因为对于任何具有 N 个元素的数组 a

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

因此,size_t 也是数组大小的便捷类型,并在多个库函数中使用。


2
不是无符号整数类型(不是unsigned int),而是无符号整型(unsigned integer type)。来自CPPReference
std::size_t是sizeof运算符的结果的无符号整数类型。
但你无法确定其确切大小,我猜这取决于平台。

1

来自sys/types.h man page:

size_t应该是一个无符号整数类型。

所以理论上它可以是无符号的short, int, long或者long long


1

不是所有的size_t都等同于unsigned int

根据C标准,6.5.3.4

两个运算符的结果值由实现定义, 其类型(一个无符号整数类型)为size_t,定义在 <stddef.h>(和其他头文件)中。

根据C标准,size_t是未定义的无符号整数类型。

根据Open Group (POSIX, etc)

64位和数据大小中性

...

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) = sizeof(size_t)

简单地说:

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


0

不,我只是在cpp.sh上运行了这个程序,它使用的是gcc:

#include <iostream>

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

然后它产生了这个输出:

4 8 8


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接