在C/ c++中,unsigned char是用来干什么的?它和常规char有什么不同?


当前回答

Signed char的范围是-128到127;Unsigned char的范围是0到255。

根据编译器的不同,Char将等价于有符号Char或无符号Char,但它是一种不同的类型。

如果你使用c风格的字符串,只使用char。如果需要使用字符进行算术运算(非常少见),请显式指定signed或unsigned以实现可移植性。

其他回答

Unsigned char是所有比特欺骗的核心。在几乎所有平台的所有编译器中,无符号字符只是一个字节和一个无符号整数(通常为8位),可以被视为一个小整数或一组位。

此外,正如其他人所说,标准并没有定义char的符号。你有三种不同的char类型:,有符号char,无符号char。

因为我觉得这真的很有必要,所以我只想说明C和c++的一些规则(在这方面它们是相同的)。首先,unsigned char的所有位都参与确定unsigned char对象的值。其次,unsigned char显式声明为unsigned。

现在,我和别人讨论过当你把int类型的值-1转换为unsigned char时会发生什么。他拒绝将生成的unsigned char的所有位都设置为1,因为他担心符号表示。但他不必如此。根据这条规则,转换会立即执行预期的操作:

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

这是一种数学描述。c++用模演算来描述它,这也符合同样的规则。不管怎样,不能保证的是整数-1中的所有位在转换前都是1。那么,我们有什么可以声明结果unsigned char的所有CHAR_BIT位都变成1呢?

所有位都参与确定它的值——也就是说,对象中没有填充位。 只添加一次UCHAR_MAX+1到-1将产生一个范围内的值,即UCHAR_MAX

事实上,这就够了!所以当你想让一个unsigned char的所有位都是1时,你可以这样做

unsigned char c = (unsigned char)-1;

由此可见,转换不仅仅是截断高阶位。幸运的是,对于2的补数来说,它只是一个截断,但对于其他符号表示来说,情况并不一定如此。

Char和unsigned Char不能保证在所有平台上都是8位类型——它们保证是8位或更大的类型。一些平台有9位、32位或64位字节。然而,今天最常见的平台(Windows、Mac、Linux x86等)都有8位字节。

如果你喜欢使用各种类型的特定长度和符号,你可能更好的uint8_t, int8_t, uint16_t等,因为他们完全做他们说。

Signed char的范围是-128到127;Unsigned char的范围是0到255。

根据编译器的不同,Char将等价于有符号Char或无符号Char,但它是一种不同的类型。

如果你使用c风格的字符串,只使用char。如果需要使用字符进行算术运算(非常少见),请显式指定signed或unsigned以实现可移植性。