当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么C++流使用char而不是unsignedchar?》经验,为你挑选了2个好方法。

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

有任何想法吗?


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



1> Steve Jessop..:

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

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

鉴于存在"char"类型,我认为通常的流使用它是有意义的,即使它的签名没有定义.所以也许你的问题可以通过答案来解答,"为什么C++只是将char定义为无符号?"


我听说从C++中删除C遗产产生了D :)
未指定意味着实现可以在其中放置它喜欢的任何值(包括每次发生时随机选择一个值),而无需记录其作用。依赖于实现的意思是实现必须记录它所带来的价值。

2> Daniel Trebb..:

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

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

这是混淆了char,signed charunsigned 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",...

之间的相似性一个char,signed charunsigned char类型是"[它们]占据存储相同量的并具有相同的对准要求".因此,您可以reinterpret_castchar *to unsigned char *到为了确定执行字符集中字符的数值.

为了回答你的问题,STL char用作默认类型的原因是因为标准流用于读取和/或写入由char对象表示的字符流,而不是整数(signed charunsigned char).使用char与数值相比是分离关注点的一种方式.

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有