【发布时间】:2013-06-13 21:37:51
【问题描述】:
为什么 char 在默认情况下应该在 -128 到 127 的范围内表示一个“字符”,其文本表示在 0 到 255 的范围内?从这个意义上说,我猜 char 默认情况下应该是无符号的,只有当我们打算只将它视为“数字”时,我们才必须添加“有符号”关键字。因此,我在处理文本文件时应该使用 unsigned char 吗?
我也不明白为什么std::ofstream 的读写函数在我需要处理二进制文件时使用char 而不是unsigned char。我不在乎签名,是吗?此外,我已经成功地使用signed char 制作了一个 JPEG 文件的副本,如下所示:
//..open all streams..
char c;
while(input.peek()!=EOF){
input.read(&c,1); //std::ifstream input;
output.write(&c,1); //std::ofstream output;
}
//..close all streams..
由于它有效,我认为read 读取unsigned bytes(在图像处理中通常使用unsigned char)并设置c,以便该值在2 的补码中具有一些意外的符号解释。我需要创建一个值的直方图,但我得到一个运行时错误,因为我使用有符号字符作为索引。当 unsigned char 至少有一个简单的读/写重载时,我必须使用一些强制转换 uc = (unsigned char)c;?,这不是很愚蠢吗?
【问题讨论】:
-
char并不总是签名的。 ASCII 以 127 结尾,因此考虑到几乎所有系统都使用它,因此不超过它是相当合乎逻辑的。 -
+1 @chris,它依赖于实现。
-
哦,我显然错过了文档中关于 char 的注释。在我的电脑上,“char”是默认签名的,它的字符集包括一些重音字母,所以对我来说没有意义。
-
@DanielKatz 忘记“默认情况下”的术语。在 char 被签名的实现中,char 和 signed char 仍然是两种不同的类型。在 char 是 unsigned 的实现中,char 和 unsigned char 仍然是两种不同的类型。在all 实现中,char、signed char 和 unsigned char 始终是三种不同的类型。这与其他整数类型不同,其中术语“默认签名”是有意义的。
-
ASCII 以 127 结尾,但自相当古老的历史以来,我们在很多平台上都有 8 位字符 - ISO8859、Windows 代码页、DOS 代码页,所有那些 90 年代奇怪的 16 位机器和80 年代的 8 位机。当然 C 和 C++ 并没有说
char是默认签名的,也许某些平台有理由默认首选签名char,但我不明白为什么签名似乎总是默认的我用过的编译器。就好像编译器编写者天生就讨厌 8 位字符集。
标签: c++