在大多数情况下,可以声明一个char
对象来指定ascii表中的一个字符值,范围从0到127.甚至扩展字符集的范围也是128到255(仍然是正数)。所以我假设在处理字符打印时,只需要使用unsigned char
。
现在,基于对SO的一些研究,人们在需要使用非常小的整数时会使用signed char
,但为此我们可以使用[u]int8
类型。所以我很难找到为什么需要使用signed char
?如果您正在处理基本字符ascii表(unsigned char
已经能够执行),您可以使用它,或者您可以使用它来表示小整数([u]int8
已经负责)。< / p>
有人可以提供一个编程示例,其中signed char
比其他类型更受欢迎吗?
答案 0 :(得分:21)
原因是,如果普通char
变量已签名或未签名,您至少不可能知道。不同的实现方法有不同的方法,普通char
可以在一个平台上签名,在另一个平台上签名。
如果要将负值存储在char
类型的变量中,则必须将其声明为signed char
,因为只有这样您才能确保每个平台都能够存储负值在那里。是的,您可以使用[u]int8
类型,但情况并非总是如此(它仅在C ++ 11中引入),事实上,int8
很可能是{{1}的别名}。
此外,signed char
和uint8_t
被定义为可选类型,这意味着您不能总是依赖它的存在(与int8_t
相反)。特别是,如果一台机器的字节单元数超过8位,则signed char
和uint8_t
定义的可能性很小(尽管它们可以;编译器总是可以自由地提供它并执行适当的计算)。请参阅此相关问题:What is int8_t if a machine has > 8 bits per byte?
答案 1 :(得分:10)
char
已签名或未签名吗?
实际上它既不是,如果char
类型的变量可以保持负值,那么它的实现是定义的。因此,如果您正在寻找以窄字符类型存储负值的便携方式,请将其明确声明为signed char
。
§3.9.1 - 基本类型 -
[basic.fundamental]
1 声明为字符(
char
)的对象应足够大,以存储实现的基本字符集的任何成员。如果此组中的字符存储在字符对象中,则该字符对象的整数值等于该字符的单个字符文字形式的值。 实施定义char
对象是否可以保留负值。
我想使用最小的有符号整数类型,哪一个呢?
c ++ 11引入了几个固定的整数类型,但一个常见的误解是这些类型保证可用,不为真。
§18.4.1 - 标题
<cstdint>
简介 -[cstdint.syn]
typedef
signed integer type
int8_t; // optional
要保留此帖子中的空间,大部分内容都被省略了,但可选基本原理适用于所有{,u}int{8,16,32,64}_t
类型。实现它们需要不。
标准规定int_least8_t
可用,但顾名思义,此类型仅保证宽度等于或大于而不是8位。
但是,该标准保证即使signed char
,char
和unsigned char
是三种不同类型 [1] ,它们也必须占用相同数量的存储并具有相同的对齐要求。
在进一步检查标准后,我们还会发现sizeof(char)
保证为1
[2] ,这意味着此类型保证占用C ++变量在给定实现下可以占用的最小空间量。
<强>结论强>
请注意,unsigned char
和signed char
必须占用与char
相同的存储量?
保证可用的最小有符号整数类型 signed char
。
[注1 ]
§3.9.1 - 基本类型 -
[basic.fundamental]
1 普通
char
,signed char
和unsigned char
是三种不同类型,统称为窄字符类型。
char
,signed char
和unsigned char
占用相同数量的存储并具有相同的对齐要求(3.11
) ;也就是说,它们具有相同的对象表示。对于窄字符类型,对象表示的所有位都参与值表示。
[ note 2 ]
§5.3.3 - 尺寸 -
[expr.sizeof]
sizeof(char)
,sizeof(signed char)
和sizeof(unsigned char)
为1。
sizeof
应用于任何其他基本类型(3.9.1)的结果是实现定义的。
答案 2 :(得分:5)
您可以将char
用于小整数的算术运算。 unsigned char
会给你更大的范围,而signed char
会给你一个更小的绝对范围和使用负数的能力。
在某些情况下,char
的小尺寸非常重要且适用于这些操作,see here,所以当一个人有负数来处理时,signed char
就是这样去吧。