在什么情况下会使用C ++中的signed char?

时间:2014-03-08 15:01:22

标签: c++ char

在大多数情况下,可以声明一个char对象来指定ascii表中的一个字符值,范围从0到127.甚至扩展字符集的范围也是128到255(仍然是正数)。所以我假设在处理字符打印时,只需要使用unsigned char

现在,基于对SO的一些研究,人们在需要使用非常小的整数时会使用signed char,但为此我们可以使用[u]int8类型。所以我很难找到为什么需要使用signed char?如果您正在处理基本字符ascii表(unsigned char已经能够执行),您可以使用它,或者您可以使用它来表示小整数([u]int8已经负责)。< / p>

有人可以提供一个编程示例,其中signed char比其他类型更受欢迎吗?

3 个答案:

答案 0 :(得分:21)

原因是,如果普通char变量已签名或未签名,您至少不可能知道。不同的实现方法有不同的方法,普通char可以在一个平台上签名,在另一个平台上签名。

如果要将负值存储在char类型的变量中,则必须将其声明为signed char,因为只有这样您才能确保每个平台都能够存储负值在那里。是的,您可以使用[u]int8类型,但情况并非总是如此(它仅在C ++ 11中引入),事实上,int8很可能是{{1}的别名}。

此外,signed charuint8_t被定义为可选类型,这意味着您不能总是依赖它的存在(与int8_t相反)。特别是,如果一台机器的字节单元数超过8位,则signed charuint8_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 charcharunsigned char是三种不同类型 [1] ,它们也必须占用相同数量的存储并具有相同的对齐要求。

在进一步检查标准后,我们​​还会发现sizeof(char) 保证1 [2] ,这意味着此类型保证占用C ++变量在给定实现下可以占用的最小空间量。


<强>结论

请注意,unsigned charsigned char必须占用与char相同的存储量?

保证可用的最小有符号整数类型 signed char



[注1 ]

  

§3.9.1 - 基本类型 - [basic.fundamental]

     
    

1 普通charsigned charunsigned char三种不同类型,统称为窄字符类型。

         

charsigned charunsigned 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就是这样去吧。