c++ - 为什么 C++ 流使用 char 而不是 unsigned char?

标签 c++ types stream overflow iostream

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

有什么想法吗?


注意:我还是不太相信。因此,如果您知道确切的答案,您仍然可以发布它。

最佳答案

可能我误解了这个问题,但是从 unsigned char 到 char 的转换不是未指定的,它取决于实现(C++ 标准中的 4.7-3)。

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

鉴于存在“char”类型,我认为即使未定义其符号,通常流也可以使用它。因此,也许您的问题可以通过“为什么 C++ 不将 char 定义为无符号?”的答案来回答?

关于c++ - 为什么 C++ 流使用 char 而不是 unsigned char?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/277655/

相关文章:

c++ - 如何安全地将 C++ 字符串传递给 Rust?

c++ - 在类中使用成员函数指针

c++ - 无论发射器速度如何,粒子流的长度都应相同

c++ - 对于 const 的引用,std::is_const 的等价物是什么?

asp.net - 使用 PostedFile.InputStream 两次

c++ - 将外部 dll 项目用于 Excel 的 c++/xll 插件

haskell - 使用不包含在类头中的不明确类型变量实现实例方法

scala - Scala中的参数化数据类型

Scala 流过滤器行为

java - 如何将 OutputStream 通过管道传输到 StreamingDataHandler?