在C/ c++中,unsigned char是用来干什么的?它和常规char有什么不同?
当前回答
Unsigned char只取正值:0到255 while Signed char有正负值:-128到+127。
其他回答
Unsigned char是所有比特欺骗的核心。在几乎所有平台的所有编译器中,无符号字符只是一个字节和一个无符号整数(通常为8位),可以被视为一个小整数或一组位。
此外,正如其他人所说,标准并没有定义char的符号。你有三种不同的char类型:,有符号char,无符号char。
Unsigned char只取正值....比如0到255
而
Signed char同时取正负值....比如-128到+127
这取决于实现,因为C标准没有定义char的符号性。根据平台的不同,char可能是有符号的,也可能是无符号的,因此如果您的实现依赖于它,则需要显式地请求有符号char或无符号char。如果您打算表示字符串中的字符,则使用char,因为这将与您的平台在字符串中放入的内容相匹配。
有符号char和无符号char之间的区别正如您所期望的那样。在大多数平台上,signed char将是一个8位的2补数,范围从-128到127,unsigned char将是一个8位的无符号整数(0到255)。注意标准并不要求char类型有8位,只要求sizeof(char)返回1。你可以在limited .h中使用CHAR_BIT获取一个char的比特数。然而,如今很少有平台会使用8以外的东西。
这里对这个问题有一个很好的总结。
正如其他人在我发布这篇文章后提到的,如果你真的想表示小整数,你最好使用int8_t和uint8_t。
有符号char和无符号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
无符号字符使用为常规字符的符号保留的位作为另一个数字。这将范围更改为[0 - 255],而不是[-128 - 127]。
当你不想要符号时,通常使用无符号字符。这在处理像移位位(移位扩展符号)和其他将字符作为字节处理而不是将其作为数字处理时会产生不同。