在C/C++中,unsigned char
用于什么?它与常规有什么不同char
?
在C++中,有三种不同的字符类型:
char
signed char
unsigned char
如果您使用文本的字符类型,请使用不合格的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
.
这是依赖于实现的,因为C标准没有定义签名char
.根据平台,char可能是signed
或者unsigned
,因此您需要明确询问signed char
或者unsigned char
您的实现是否依赖于它.只要使用char
,如果你打算从字符串表示字符,因为这将匹配你的平台上放的字符串中.
signed char
和之间的区别unsigned char
正如您所期望的那样.在大多数平台上,signed char
将范围从8位二进制补码数-128
来127
,而且unsigned char
将是一个8位无符号整数(0
到255
).注意,标准不要求char
类型有8位,只sizeof(char)
返回1
.您可以使用CHAR_BIT
in 获取char中的位数limits.h
.如果有任何平台,今天很少有这样的东西8
.
有这个问题的一个很好的总结在这里.
正如其他人在我发布之后所提到的那样,你最好不要使用int8_t
,uint8_t
如果你真的想要代表小整数.
因为我觉得它确实需要,我只想说明C和C++的一些规则(在这方面它们是相同的).首先,所有位的unsigned char
参与确定是否有任何无符号字符对象的值.其次,unsigned char
明确表示未签名.
现在,我与某人讨论了将-1
int类型的值转换为时会发生什么unsigned char
.他拒绝了这样的想法,即结果unsigned char
将其所有位都设置为1,因为他担心符号表示.但他不必.它立即遵循此规则,即转换符合预期目的:
如果新类型是无符号的,则通过重复地添加或减去一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内.(
6.3.1.3p2
在C99草案中)
这是一个数学描述.C++以模数微积分的形式描述它,它产生相同的规则.无论如何,不能保证的是整数-1
中的所有位都是转换前的一位.那么,我们有什么,所以我们可以声称结果的unsigned char
所有CHAR_BIT
位都变为1?
所有位都参与确定其值 - 即,对象中不会出现填充位.
只添加一次UCHAR_MAX+1
,以-1
将产生在范围内的值,即UCHAR_MAX
实际上,这已经足够了!因此,无论何时你想拥有一个unsigned char
所有的位,你都可以
unsigned char c = (unsigned char)-1;
它也遵循一个转换不只是截断高阶位.两个补码的幸运事件是它只是一个截断,但对于其他符号表示则不一定如此.
至于unsigned char的使用示例:
unsigned char通常用在计算机图形中,这通常(尽管不总是)为每个颜色组件分配一个字节.通常看到RGB(或RGBA)颜色表示为24(或32)位,每个都是无符号字符.由于unsigned char值落在[0,255]范围内,因此这些值通常被解释为:
0表示完全缺少给定的颜色成分.
255表示100%的给定颜色颜料.
所以你最终会得到RGB红色为(255,0,0) - >(100%红色,0%绿色,0%蓝色).
为什么不使用签名的字符?算术和位移变得有问题.正如已经解释的那样,签名的char的范围基本上会移动-128.用于将RGB转换为灰度的非常简单且天真(通常未使用)的方法是平均所有三种颜色分量,但是当颜色分量的值为负时这会遇到问题.使用无符号字符算术时,红色(255,0,0)平均为(85,85,85).但是,如果值是char s(127,-128,-128),我们最终会得到(-99,-99,-99),这在我们的unsigned char空间中是(29,29,29),这是不正确的.
如果要将字符用作小整数,最安全的方法是使用int8_t
和uint8_t
类型.
unsigned char
只接受正值...。例如0到255
在哪里
signed char
同时接受正值和负值。...例如-128至+127
char
并且unsigned char
不保证在所有平台上都是8位类型 - 它们保证是8位或更大.某些平台具有9位,32位或64位字节.但是,目前最常见的平台(Windows,Mac,Linux x86等)都有8位字节.
signed char
范围-128到127; unsigned char
范围是0到255.
char
将等效于signed char或unsigned char,具体取决于编译器,但它是一种不同的类型.
如果您使用的是C风格的字符串,请使用char
.如果需要使用字符进行算术运算(非常罕见),请明确指定signed或unsigned以实现可移植性.
无符号字符是(无符号)字节值(0到255)。您可能会认为“字符”是“字符”,但这实际上是一个数字值。常规“ char”是带符号的,因此您有128个值,并且这些值使用ASCII编码映射到字符。但是无论哪种情况,您存储在内存中的都是一个字节值。