我一直想知道为什么C ++标准库使用 char 类型而不是 unsigned char 类型实例化basic_ [io]流及其所有变体。 char 表示(取决于它是否已签名),您可以对get()等操作进行上溢和下溢,这将导致所涉及变量的实现定义值。另一个例子是当你想使用 put 函数将一个未格式化的字节输出到ostream。

有什么想法吗?


注意:我仍然不相信。所以如果你知道明确的答案,你仍然可以发布它。

有帮助吗?

解决方案

可能我误解了这个问题,但是从unsigned char到char的转换并没有特别说明,它依赖于实现(C ++标准中的4.7-3)。

C ++中的1字节字符的类型是“char”,而不是“unsigned char”。这为实现提供了更多的自由来在平台上做最好的事情(例如,标准组织可能认为存在CPU,其中有符号字节算法比无符号字节算法更快,尽管这是我的推测)。也是为了与C兼容。从C ++中消除这种存在不确定性的结果是C#; - )

鉴于“char”, type存在,我认为通常的流使用它是有意义的,即使它的签名没有定义。所以也许你的问题可以通过答案回答,“为什么C ++没有将char定义为无符号?”

其他提示

我总是这样理解: iostream 类的目的是读取和/或写入一个字符流,如果你考虑它,它们只是抽象的实体由计算机使用字符编码表示。 C ++标准很难避免固定字符编码,只说“声明为字符的对象( char )应足够大以存储实现的基本字符集的任何成员”。因为它不需要强制执行“实现基本字符集”。定义C ++语言;标准可以让 字符编码用于实现(编译器与STL实现一起)的决定,并且注意 char 对象表示某些编码中的单个字符

实现编写者可以选择单八位字节编码,例如 ISO-8859-1 甚至是双八位字节编码,例如 UCS-2 。没关系。只要 char 对象“足够大以存储实现的基本字符集的任何成员”即可。 (请注意,这明确禁止可变长度编码),然后实施甚至可以选择以与任何常见编码不兼容的方式表示基本拉丁语的编码!

令人困惑的是 char signed char unsigned char 类型共享" char"在他们的名字中,但重要的是要记住 char 不属于与 signed char unsigned char 。 signed char 属于有符号整数类型:

  

有四个有符号整数类型:“signed char”,“short int”,“int”和“long int。”

unsigned char 属于无符号整数类型:

  

对于每个有符号整数类型,存在相应的(但不同的)无符号整数类型:“unsigned char”,“unsigned short int”,“unsigned int”,以及“unsigned long int”, ...

char signed char unsigned char 类型之间的一个相似之处是“[他们]占用相同数量的存储并具有相同的对齐要求“。因此,您可以 reinterpret_cast char * unsigned char * ,以确定执行字符集中字符的数值。 / p>

要回答您的问题,STL使用 char 作为默认类型的原因是因为标准流用于读取和/或写入字符流,由 char <表示/ code>对象,而不是整数( signed char unsigned char )。 char 与数值的使用是分离问题的一种方式。

char表示字符,unsigned char表示原始字节数据,而signed表示字符,以及签名数据。

Standard没有指定signed或unsigned char是否将用于char的实现 - 它是特定于编译器的。它只指定“char”。将是“足够的”在你的系统中保存字符 - 当时人物的方式,即没有UNICODE。

使用“char”对于角色来说是标准的方式。使用unsigned char是一种破解,虽然它在大多数平台上都匹配编译器的char实现。

我认为评论很好地解释了这一点。引用:

  

signed char和unsigned char是算术,整数类型,就像int和unsigned int一样。另一方面,char明确地旨在是“I / O”。表示平台上某些不透明的,系统特定的基本数据单元的类型。我会以这种精神使用它们。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top