为什么在C ++中默认签名'char'?

时间:2013-06-13 21:37:51

标签: c++

为什么char默认在-128到127的范围内,它应该表示一个'字符',其文本表示的范围是0到255?从这个意义上说,我猜猜字符号默认情况下应该是无符号的,只有当我们打算将它视为'数字'时我们必须添加'signed'关键字。因此,当我处理文本文件时,我应该使用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 byte s(在图像处理中常用unsigned char)并设置c以使值有一些意外签名解释为2的补码。我需要创建一个值的直方图,但我得到一个运行时错误,因为我使用signed char作为索引。当对于unsigned char至少有一个简单的读/写重载时,我必须使用一些强制转换uc = (unsigned char)c;?,这不是很愚蠢吗?

2 个答案:

答案 0 :(得分:48)

不是。

charsigned char的{​​{1}}的签名是实现定义的。许多系统使其签名以匹配默认情况下 签名的其他类型(如unsigned char),但在某些系统上可能未签名。 (比方说,如果你将int传递给GCC。)

答案 1 :(得分:32)

以下是您对标准的回答:

  

3.9.1基本类型[basic.fundamental]

     

1声明为字符char的对象应足够大,以存储实现的基本字符集的任何成员。如果此组中的字符存储在字符对象中,则该字符对象的整数值等于该字符的单个字符文字形式的值。实现定义char对象是否可以保存负值。字符可以显式声明为unsigned或signed。 Plain char,signed char和unsigned char是三种不同的类型。 char,signed char和unsigned char占用相同数量的存储空间并具有相同的对齐要求(basic.types);也就是说,它们具有相同的对象表示。对于字符类型,对象表示的所有位都参与值表示。对于无符号字符类型,值表示的所有可能位模式表示数字。这些要求不适用于其他类型。 在任何特定实现中,普通char对象可以采用与signed char或unsigned char相同的值;哪一个是实现定义的。