C++标准是否保证std::uintmax_t可以容纳std::size_t的所有值?

24

C++标准是否保证(明确声明或隐含逻辑推导),std::uintmax_t可以容纳所有std::size_t的值?

或者说,std::numeric_limits<std::size_t>::max()可能比std::numeric_limits<std::uintmax_t>::max()更大吗?


在旧版本的GCC中,std::size_t是(错误地)带符号的。因此:虽然不总是这样,但它仍将映射到唯一值,因此您可以来回切换而没有问题。更可能的是,size_tuintmax_t短。 - Dave
1个回答

34

是的。

size_t被定义为无符号整型,其大小足以容纳任何对象的大小。uintmax_t被定义为能够存储任何无符号整数类型的值。因此,如果size_t可以存储它,uintmax_t也可以存储它。

C++11 §18.2对size_t的定义:

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

C99 §7.18.1.5对uintmax_t的定义(通过规范引用包含在C++中):

以下类型指定了一种无符号整数类型,能够表示任何无符号整数类型的值:

uintmax_t

8
没问题。根据定义,uintmax_t 是最大的无符号整数类型,而 size_t 是一种无符号整数类型,通过推断,我们可以说 uintmax_t 必须能够容纳 size_t 的所有值。 - Xeo
有人能为我找到uintmax_t定义的C99章节号码吗?我没有副本。谢谢。 - Joseph Mansfield
5
在C99标准中的第7.18.1.5节(在C2011中为7.20.1.5节)。 - Daniel Fischer
@sftrabbit:非常感谢你的精确答案。正是我所需要的。 - JohnCand

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