在C / C ++中,unsigned char
用于什么?它与常规char
有什么不同?
答案 0 :(得分:511)
在C ++中,有三种不同的字符类型:
char
signed char
unsigned char
如果您使用 text 的字符类型,请使用不合格的char
:
'a'
或'0'
等字符文字的类型。"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可能是signed
或unsigned
,因此如果您的实施取决于它,则需要明确要求signed char
或unsigned char
。如果您想要表示字符串中的字符,请使用char
,因为这将与您的平台在字符串中的内容相匹配。
signed char
和unsigned char
之间的差异正如您所期望的那样。在大多数平台上,signed char
将是从-128
到127
的8位二进制补码数,unsigned char
将是一个8位无符号整数({{1}到0
)。请注意,该标准不要求255
类型有8位,只有char
返回sizeof(char)
。您可以使用1
中的CHAR_BIT
获取字符中的位数。但是,如果有任何平台,那么这将是limits.h
以外的其他平台。
此问题有一个很好的摘要here。
正如其他人在我发布之后提到的那样,如果你真的想要代表小整数,最好使用8
和int8_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?
UCHAR_MAX+1
添加一次-1
将产生范围内的值,即UCHAR_MAX
实际上,这已经够了!因此,只要你想让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]范围内,因此这些值通常被解释为:
所以你最终会得到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_t
和uint8_t
类型。
答案 5 :(得分:5)
signed char
的范围是-128到127; unsigned char
的范围是0到255.
char
将等同于signed char或unsigned char,具体取决于编译器,但它是一种不同的类型。
如果您使用的是C风格的字符串,请使用char
。如果你需要使用chars进行算术运算(非常罕见),请明确指定signed或unsigned以实现可移植性。
答案 6 :(得分:5)
char
和unsigned char
在所有平台上都是8位类型 - 它们保证为8位或更大。有些平台有9-bit, 32-bit, or 64-bit bytes。但是,目前最常见的平台(Windows,Mac,Linux x86等)都有8位字节。
答案 7 :(得分:4)
就直接值而言,当已知值介于CHAR_MIN
和CHAR_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 char
和unsigned 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”一书:
限定符signed
或unsigned
可以应用于char或任何整数。无符号数
总是正或零,并遵守算术模2 ^ n的定律,其中n是数
类型中的位数。因此,例如,如果字符是8位,则无符号字符变量具有值
在0到255之间,而有符号的字符值介于-128到127之间(二进制)
补码机。)无论是有符号还是无符号的纯字符是机器相关的,
但可打印的角色总是积极的。
答案 16 :(得分:0)
unsigned char只接受正值:0到255 signed char取正值和负值:-128到+127