cstdint
typedef绝对有可能绑定到char变量。例如,uint_least8_t
很可能与unsigned char
绑定,而int_least8_t
绑定到signed char
。
标准是否保证size_t
或类似类型不会发生类似事情?或者至少有一种纯理论上的机会,即这些类型会绑定到某些字符类型,例如unsigned char
或甚至wchar_t
?
答案 0 :(得分:5)
我们所知道的std::size_t
是:
type size_t是一个实现定义的无符号整数类型,其大小足以包含大小 以字节为单位的任何对象。
如果unsigned char
符合此条件,则可以将其用作std::size_t
。
然而,这种关注纯粹是理论上的,因为没有一个真正的平台(我知道) (好吧,那是错的)一个字符type用作unsigned char
足够宽std::size_t
等。
如果你是超级偏执者,你可以使用一元int
将价值提升至至少+
:
std::cout << +vector.size();
即使尺寸类型是字符类型,也会打印该数字。
对于阅读,您可以使用std::common_type<unsigned int, std::size_t>::type
类型的变量(可能通过typedef
),然后在sizeof(int) > sizeof(std::size_t)
的情况下进行边界检查。
答案 1 :(得分:0)
文档N3337是最接近C ++ 11的近似值,可以在线免费获取。相关章节是3.9.1 [basic.fundamental],18.2 [support.types]和18.4 [cstdint]。
除了wchar_t
之外,您感兴趣的所有类型名称都必须是typedef
s,才能获得相应签名的原始整数类型。 signed char
和unsigned char
被认为是原始整数类型;普通char
不是。 wchar_t
很特别;在C ++(而不是C)中,它是关键字(如int
)和不同的原始类型。
普通char
,signed char
和unsigned char
被视为字符类型; wchar_t
,char16_t
和char32_t
是非字符类型(也不是整数类型)。
所以答案是你提到的所有类型,除了wchar_t
,可以可以被定义为signed char
或unsigned char
,但不是那么简单char
。
是的,这很令人困惑。它反映了与C的不同级别兼容性的纠结历史,以及关于如何处理无法用ASCII表示的文本的不断变化的想法。