是size_t总是无符号的int

Is size_t is always unsigned int

本文关键字:int 无符号 size      更新时间:2023-10-16

是否有任何实现size_t定义为unsigned int以外的其他东西?在我工作的每个系统中,它都被定义为无符号的int,所以我只是好奇。

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型号(

No.但它是无符号整数类型。它不必是特定的 int

对于C++

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

C++标准章节 18.2.6

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

对于 linux;"Linux 中 c++ size_t在哪里定义"给出了long unsigned int

对于 C

(该问题最初标记为 C 和 C++。

看看这里的答案:

32 位与各种 64 位数据模型的大小 (size_t( 是多少?

绝对不能保证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,或者 uintmax_t在 C9X 中。这也限制了最大元素数 可以在数组中声明,因为对于任何数组a N 元素

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

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

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

std::size_t 是 sizeof 的结果的无符号整数类型 算子

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

从 sys/types.h 手册页:

size_t应为无符号整数类型。

所以至少在理论上它可以是一个无符号的shortintlonglong long

No. size_t可以而且确实与unsigned int不同。

根据C标准6.5.3.4:

两个运算符的结果值都是实现定义的, 并且其类型(无符号整数类型(为 size_t ,定义于 <stddef.h>(和其他标头(。

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

根据开放组(POSIX等(:

64 位和数据大小中立性

sizeof(char( <= sizeof(short( <=

sizeof(int( <= sizeof(long( = 尺寸(size_t(

简单地说:

size_t size_t. 不符合这一点的代码是错误的。

No.我刚刚在 gcc cpp.sh 上运行了这个程序:

#include <iostream>
int main()
{
  std::cout << sizeof(unsigned int) << " " << sizeof(unsigned long) << " " << sizeof(size_t) << "n";
}

它产生以下输出:

4 8 8