为什么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..
Run Code Online (Sandbox Code Playgroud)
因为它工作,我认为read读取unsigned bytes(在图像处理中unsigned char是常用的)并设置,c以便该值在2的补码中有一些偶然的符号解释.我需要创建一个值的直方图,但我得到一个运行时错误,因为我使用signed char作为索引.uc = (unsigned char)c;?当对于unsigned char至少有一个简单的读/写重载时,我必须使用一些强制转换,这不是很愚蠢吗?
dus*_*uff 50
事实并非如此.
a的签名char既不是a signed char也不unsigned char是实现定义的.许多系统使之签署,以配合其他类型的默认(如签署int),但它可能在某些系统上是无符号.(比方说,如果你-funsigned-char转到GCC.)
Jea*_*rin 33
以下是标准的答案:
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相同的值; 哪一个是实现定义的.
| 归档时间: |
|
| 查看次数: |
13207 次 |
| 最近记录: |