什么是unsigned char?

时间:2008-09-16 18:05:19

标签: c++ c char

在C / C ++中,unsigned char用于什么?它与常规char有什么不同?

17 个答案:

答案 0 :(得分:511)

在C ++中,有三种不同的字符类型:

  • char
  • signed char
  • unsigned char

如果您使用 text 的字符类型,请使用不合格的char

  • 它是'a''0'等字符文字的类型。
  • 它是组成C字符串的类型,如"abcde"

它也可以作为数字值,但未指定该值是被视为有符号还是无符号。注意通过不等式进行字符比较 - 尽管如果你将自己限制在ASCII(0-127),那么你就是安全的。

如果您将字符类型用作数字,请使用:

  • signed char,它为至少 -127到127范围。 (-128到127是常见的)
  • unsigned char,它为提供了至少 0到255的范围。

“至少”,因为C ++标准仅提供每种数值类型需要覆盖的最小值范围。 sizeof (char)需要为1(即一个字节),但理论上一个字节可以是例如32位。 sizeof仍然会将其大小报告为1 - 这意味着您可以拥有sizeof (char) == sizeof (long) == 1

答案 1 :(得分:79)

这是依赖于实现的,因为C标准没有定义char的签名。根据平台,char可能是signedunsigned,因此如果您的实施取决于它,则需要明确要求signed charunsigned char。如果您想要表示字符串中的字符,请使用char,因为这将与您的平台在字符串中的内容相匹配。

signed charunsigned char之间的差异正如您所期望的那样。在大多数平台上,signed char将是从-128127的8位二进制补码数,unsigned char将是一个8位无符号整数({{1}到0)。请注意,该标准不要求255类型有8位,只有char返回sizeof(char)。您可以使用1中的CHAR_BIT获取字符中的位数。但是,如果有任何平台,那么这将是limits.h以外的其他平台。

此问题有一个很好的摘要here

正如其他人在我发布之后提到的那样,如果你真的想要代表小整数,最好使用8int8_t

答案 2 :(得分:35)

因为我觉得它确实需要,我只想说明C和C ++的一些规则(在这方面它们是相同的)。首先,unsigned char所有位参与确定任何unsigned char对象的值。其次,unsigned char明确表示未签名。

现在,我与某人讨论了将int类型的值-1转换为unsigned char时会发生什么。他拒绝了由此产生的unsigned char将其所有位设置为1的想法,因为他担心符号表示。但他不必。它立即遵循这条规则,即转换符合预期目的:

  

如果新类型是无符号的,则通过重复添加或转换该值   减去一个可以在新类型中表示的最大值   直到该值在新类型的范围内。 (C99草案中6.3.1.3p2

这是一个数学描述。 C ++以模数微积分的形式描述它,它产生相同的规则。无论如何, not 保证的是整数-1中的所有位在转换之前都是一位。那么,我们有什么,所以我们可以声称结果unsigned char的所有CHAR_BIT位都变为1?

  1. 所有位都参与确定其值 - 也就是说,对象中没有填充位。
  2. 仅向UCHAR_MAX+1添加一次-1将产生范围内的值,即UCHAR_MAX
  3. 实际上,这已经够了!因此,只要你想让unsigned char的所有位都为1,你就可以了

    unsigned char c = (unsigned char)-1;
    

    此外,转换只是截断高阶位。 二的补充的幸运事件是它只是一个截断,但对于其他符号表示则不一定如此。

答案 3 :(得分:24)

至于 unsigned char 的示例用法:

unsigned char 通常用于计算机图形学中,通常(但并不总是)为每个颜色分量分配一个字节。通常会看到RGB(或RGBA)颜色表示为24(或32)位,每个颜色都是 unsigned char 。由于 unsigned char 值落在[0,255]范围内,因此这些值通常被解释为:

  • 0表示完全没有给定的颜色成分。
  • 255表示100%的给定颜色颜料。

所以你最终会得到RGB红色为(255,0,0) - > (100%红色,0%绿色,0%蓝色)。

为什么不使用签名的字符?算术和位移变得有问题。正如已经解释的那样, signed char 的范围基本上被移动了-128。用于将RGB转换为灰度的非常简单且天真(通常未使用)的方法是平均所有三种颜色分量,但是当颜色分量的值为负时这会遇到问题。使用 unsigned char 算术时,红色(255,0,0)平均为(85,85,85)。但是,如果值是 signed char s(127,-128,-128),我们最终会得到(-99,-99,-99),这将是(29,29, 29)在我们的 unsigned char 空间中,这是不正确的。

答案 4 :(得分:12)

如果您想将字符用作小整数,最安全的方法是使用int8_tuint8_t类型。

答案 5 :(得分:5)

signed char的范围是-128到127; unsigned char的范围是0到255.

char将等同于signed char或unsigned char,具体取决于编译器,但它是一种不同的类型。

如果您使用的是C风格的字符串,请使用char。如果你需要使用chars进行算术运算(非常罕见),请明确指定signed或unsigned以实现可移植性。

答案 6 :(得分:5)

并不保证

charunsigned char在所有平台上都是8位类型 - 它们保证为8位或更大。有些平台有9-bit, 32-bit, or 64-bit bytes。但是,目前最常见的平台(Windows,Mac,Linux x86等)都有8位字节。

答案 7 :(得分:4)

就直接值而言,当已知值介于CHAR_MINCHAR_MAX之间时使用常规字符,而unsigned char则提供正端的两倍范围。例如,如果CHAR_BIT为8,则常规char的范围仅保证为[0,127](因为它可以是有符号或无符号的),而unsigned char将为[0 ,255]和signed char将是[-127,127]。

就其用途而言,标准允许POD(普通旧数据)的对象直接转换为unsigned char数组。这允许您检查对象的表示和位模式。对于char或signed char,不存在安全类型惩罚的相同保证。

答案 8 :(得分:4)

unsigned char仅采用正值....如 0 255

其中

signed char同时接受正值和负值......例如 -128 +127

答案 9 :(得分:3)

unsigned char是(无符号)字节值(0到255)。你可能会认为“char”是一个“字符”,但它实际上是一个数值。常规“char”已签名,因此您有128个值,并且这些值使用ASCII编码映射到字符。但无论哪种情况,你在内存中存储的都是字节值。

答案 10 :(得分:2)

signed charunsigned char都代表1字节,但是它们具有不同的范围。

   Type        |      range
-------------------------------
signed char    |  -128 to +127
unsigned char  |     0 to 255

signed char中,如果我们考虑char letter = 'A',则'A'表示ASCII/Unicode中65的二进制数,如果可以存储65,则也可以存储-65。 ASCII/Unicode中没有负二进制值,因此无需担心负值。

示例

#include <stdio.h>

int main()
{
    signed char char1 = 255;
    signed char char2 = -128;
    unsigned char char3 = 255;
    unsigned char char4 = -128;

    printf("Signed char(255) : %d\n",char1);
    printf("Unsigned char(255) : %d\n",char3);

    printf("\nSigned char(-128) : %d\n",char2);
    printf("Unsigned char(-128) : %d\n",char4);

    return 0;
}

输出-:

Signed char(255) : -1
Unsigned char(255) : 255

Signed char(-128) : -128
Unsigned char(-128) : 128

答案 11 :(得分:2)

unsigned char是所有技巧的核心。在ALL平台的几乎所有编译器中,unsigned char只是一个BYTE。无符号整数(通常)为8位。可以视为小整数或一包位。

另外,正如其他人所说,标准没有定义字符的符号。所以你有3种不同的“char”类型:char,signed char,unsigned char。

答案 12 :(得分:2)

unsigned char使用为常规char的符号保留的位作为另一个数字。这会将范围更改为[0 - 255]而不是[-128 - 127]。

当您不想要标志时,通常使用未签名的字符。当处理char作为一个字节而不是将它作为数字使用时,这会改变比特(移位扩展符号)等事情会有所不同。

答案 13 :(得分:2)

如果您喜欢使用各种类型的特定长度和签名,那么您可能最好使用uint8_t,int8_t,uint16_t等,因为它们完全按照他们的说法进行操作。

答案 14 :(得分:1)

一些谷歌搜索发现this,人们对此进行了讨论。

unsigned char基本上是一个字节。因此,如果您需要一个字节的数据,您可以使用它(例如,您可能希望使用它来设置打开和关闭标志以传递给函数,这通常在Windows API中完成)。

答案 15 :(得分:0)

引用了“c编程laugage”一书:

限定符signedunsigned可以应用于char或任何整数。无符号数 总是正或零,并遵守算术模2 ^ n的定律,其中n是数 类型中的位数。因此,例如,如果字符是8位,则无符号字符变量具有值 在0到255之间,而有符号的字符值介于-128到127之间(二进制) 补码机。)无论是有符号还是无符号的纯字符是机器相关的, 但可打印的角色总是积极的。

答案 16 :(得分:0)

unsigned char只接受正值:0到255 signed char取正值和负值:-128到+127