C ++标准§3.9.1基本类型
声明为字符的对象(char) 应足够大,以存储任何 实施成员的基础 字符集。如果一个角色来自 该集存储在一个字符中 对象,它的整数值 character对象等于该值 单字符文字形式 那个角色。它是 实现 - 定义是否为char 对象可以保持负值。 可以显式声明字符 未签名或签名。简单的char,签名 char和unsigned char是三个 不同的类型。< ...>
我无法理解unsigned char。
数字可能是+1或-1。
我不能以类似的方式思考-A和+ A.
引入unsigned char的历史原因是什么。
答案 0 :(得分:2)
char
实际上是一个整数类型。只是该类型也用于表示一个角色。由于它是一个整体类型,所以谈论签名是有效的。
(我不确切知道历史原因。可能会通过将byte
与char
合并来保存{{1}}的关键字。)
答案 1 :(得分:2)
在C(以及C ++)中, char
并不代表字符。它表示一个字节(int_least8_t
)。这是从Unicode之前的日子开始的历史遗留,当时角色实际上可以放在char
中,但现在是该语言的一个缺陷。
由于char
实际上是一个小整数,因此signed char
和unsigned char
是有意义的。实际上有三种不同的char
类型:char
,signed char
和unsigned char
。一个常见的约定是unsigned char
表示字节,而普通char
表示字符 UTF-8代码单元。
答案 2 :(得分:1)
计算机不“理解”字母或字符的概念;他们只对数字起作用。所以一群人聚在一起,同意用什么数字映射到什么字母。最常用的是ASCII(虽然语言不能保证)。
在ASCII中,字母 A 的代码 65 。在使用ASCII的环境中,字母 A 将由数字 65 表示。
char
数据类型也可以作为整数类型 - 这意味着它只能包含数字,因此允许使用unsigned
和signed
。在我见过的大多数平台上,char
是一个8位字节。
答案 3 :(得分:1)
你读得太多了。角色是一种可以容纳角色的小整数类型。故事结局。无符号字符从未被引入或打算,它就是这样,因为char是与int或long或short相同的整数类型,它只是大小不同。事实是,没有理由使用unsigned char,但是如果他们想要一个字节的无符号整数存储,人们就会这样做。
答案 4 :(得分:1)
如果你想要一个小内存占用打印并想要存储一个数字而不是有符号和无符号字符是有用的。
如果要使用128-255之间的值,则需要unsigned char
unsigned char score = 232;
如果你想存储两个字符之间的差异,signed char是usfull。
signed char diff = 'D' - 'A';
char与其他两个不同,因为你不能认为它是。
答案 5 :(得分:0)
你可以使用255到0的溢出吗? (我不知道。只是一个猜测)
可能不仅是关于字符,还有关于-128到127和0到255之间的数字。
答案 6 :(得分:-1)
想想ASCII字符集。
历史上,计算中用于文本的所有字符都是由ASCII字符集定义的。每个字符由一个8位字节表示,该字节是无符号的,因此每个字符的值都在0到255之间。
单词字符缩减为char以进行编码。
8位字符使用与8位字节相同的内存,因此就编译器而言它们是可互换的。
编译器指令unsigned(默认情况下,所有数字都被签名,因为twos compliment用于表示二进制中的负数),当应用于字节或char时强制它们具有0-255范围内的值。
如果是无符号,那么其值为-128 - +127。
现在随着UNICODE和多字节字符集的出现,字节和字符之间的这种关系不再存在。
答案 7 :(得分:-1)
我不确定,但我的猜测是签名字符可用于区分“常规”ASCII(仅需7位)和“其他”字符。如果(ch > 0)
是真的,你知道你正在处理一个熟悉的角色,在所有终端上以相同的方式打印。当(ch < 0)
时,它是“OEM代码页”或其他类似内容,这意味着打印的实际字符取决于特定终端的编码。它可以产生表格画线,西里尔字母或斯堪的纳维亚口音。