繁体   English   中英

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

[英]Why do C++ streams use char instead of unsigned char?

我一直想知道为什么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”类型,我认为通常的流使用它是有意义的,即使它的签名没有定义。 所以也许你的问题可以通过答案来解答,“为什么C ++只是将char定义为无符号?”

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

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

令人困惑的是charsigned charunsigned char类型在它们的名称中共享“char”,但重要的是要记住char不属于与signed charunsigned char相同的基本类型族。 signed char是有符号整数类型的系列:

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

unsigned char在无符号整数类型的族中:

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

charsigned charunsigned char类型之间的一个相似之处是“[它们]占用相同数量的存储并具有相同的对齐要求”。 因此,您可以从char * reinterpret_castunsigned char * ,以确定执行字符集中字符的数值。

为了回答你的问题,STL使用char作为默认类型的原因是因为标准流用于读取和/或写入字符流,由char对象表示,而不是整数( signed charunsigned 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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM