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

===============>>#1 票数:527 已采纳

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

  • char
  • signed char
  • unsigned char

如果将字符类型用于文本 ,请使用不合格的char

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

它也可以作为数字值计算,但是不确定该值是带符号的还是无符号的。 注意通过不等式进行字符比较-尽管如果将自己限制为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

===============>>#2 票数:84

这取决于实现,因为C标准没有定义char的符号性。 根据平台的不同,char可能是有signedunsigned ,因此,如果您的实现依赖于它,则需要显式地请求有signed charunsigned char 如果要表示字符串中的字符,只需使用char ,因为这将与您的平台在字符串中放入的字符匹配。

signed charunsigned char之间的区别是您所期望的。 在大多数平台上,带signed char将是从-128127的8位二进制补码, unsigned char将是8位的无符号整数( 0255 )。 请注意,该标准不要求char类型具有8位,只有sizeof(char)返回1 您可以在limits.h使用CHAR_BIT获得char的位数。 如今,几乎没有任何平台会是8以外的平台。

有这个问题的一个很好的总结在这里

正如自从我发布此文章以来其他人提到的int8_t ,如果您真的想表示小整数,最好使用int8_tuint8_t

===============>>#3 票数:34

因为我觉得确实需要这样做,所以我只想陈述一些C和C ++的规则(在这方面它们是相同的)。 首先, unsigned char 所有位都参与确定值(如果有任何无符号字符对象)。 其次, unsigned char被明确声明为unsigned。

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

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

那是数学上的描述。 C ++用模演算来描述它,这产生了相同的规则。 无论如何, 不能保证整数-1中的所有位在转换前都是1。 那么,我们拥有什么,可以断言所得到的unsigned char所有CHAR_BIT位都变为1?

  1. 所有位都参与确定其值-也就是说,对象中没有填充位。
  2. 仅将UCHAR_MAX+1加到-1会产生一个范围内的值,即UCHAR_MAX

够了,实际上! 因此,每当您想要一个unsigned char所有位都为1时,

unsigned char c = (unsigned char)-1;

随之而来的是,转换只是截断高阶位。 二进制补码的幸运事件是它只是一个截断,但对于其他符号表示形式并不一定是正确的。

===============>>#4 票数:24

例如unsigned char的用法:

unsigned char通常用在计算机图形学中,它经常(尽管不总是)为每个颜色分量分配一个字节。 通常会看到以24(或32)位表示的RGB(或RGBA)颜色,每个颜色均为无符号char 由于无符号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),在我们的无符号char空间中为(29,29,29) ,这是不正确的。

===============>>#5 票数:13

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

===============>>#6 票数:6

unsigned char仅采用正值。...例如0255

在哪里

signed char接受正负值。...例如-128+127

===============>>#7 票数:6

在所有平台上, charunsigned char均不保证为8位类型,而是保证为8位或更大。 某些平台具有9位,32位或64位byte 但是,当今最常见的平台(Windows,Mac,Linux x86等)具有8位字节。

===============>>#8 票数:5

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

根据编译器的不同, char将等效于有符号的char或无符号的char,但它是不同的类型。

如果您使用的是C型字符串,则只需使用char 如果您需要使用char进行算术运算(很少见),请为可移植性明确指定有符号或无符号。

===============>>#9 票数:5

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

===============>>#10 票数:4

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

就其用途而言,标准允许将POD(普通旧数据)的对象直接转换为无符号字符数组。 这使您可以检查对象的表示形式和位模式。 对于char或signed char,不存在相同的安全类型修剪保证。

===============>>#11 票数:2

如果您喜欢使用各种类型的特定长度和签名,则最好使用uint8_t,int8_t,uint16_t等,因为它们完全按照自己的意思说。

===============>>#12 票数:2

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

通常,当您不想要符号时使用未签名的字符。 当执行诸如移位位(shift扩展符号)之类的操作以及将char作为字节而不是将其用作数字的其他操作时,这将有所不同。

===============>>#13 票数:2

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

正如其他人所说,在成瘾中,标准没有定义字符的符号。 因此,您有3种不同的“字符”类型:字符,有符号字符,无符号字符。

===============>>#14 票数:1

无符号字符仅采用正值:0至255有符号字符采用正和负值:-128至+127

===============>>#15 票数:1

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

无符号字符基本上是一个字节。 因此,如果需要一个字节的数据,则可以使用它(例如,可能要使用它来设置标志的开和关,以将其传递给函数,就像Windows API中经常这样做的那样)。

===============>>#16 票数:0

引用《 c编程专家》一书:

限定符带signedunsigned可应用于char或任何整数。 无符号数始终为正或零,并遵守2 ^ n取模的数学定律,其中n是类型中的位数。 因此,例如,如果char是8位,则无符号char变量的值在0到255之间,而有符号char的值在-128到127之间(在二进制补码机中。)普通字符是有符号还是无符号是机器依赖,但可打印字符始终为正。

  ask by Landon Kuhn translate from so

未解决问题?本站智能推荐:

1回复

添加两个未签名的字符

我有分配要使用平移添加两个未签名的字符。 s是摘要,p是“溢出”,我不知道怎么说。 这是我的代码,出了点问题,它总是打印0 0
3回复

如何正确比较两个未签名的字符?

想要比较两个 来自IP_ADAPTER_ADDRESSES结构 在Windows中将byte定义为typedef unsigned char BYTE; 我需要比较内存吗? 谢谢!
2回复

如何从有效载荷未签名的字符buf中获取IP和PORT?

我有未签名的char buf: IP位于197位置,端口位于205位置。如何从这个未签名的char buf获取正确的IP和PORT? 我尝试了一些数字转换,但是没有运气:( 任何帮助或提示表示赞赏。
2回复

使用%u读取签名的字符

该程序在我的32位Ubuntu机器上生成以下输出。 前两行输出我能理解=> 第1行 :在内存中存储字节的顺序。 第二行 :第二个字节值的有符号值(2的补码)。 第3行 :为什么这么大的价值? 请解释最后一行输出。 为什么添加三个1的字节,因为(
1回复

为数组中的未签名char分配一个short的结果是什么?

我得到了一个短值(只能将其限制为UINT8 ),并希望将其分配给UINT8 (/ unsigned char )。 但是我认为没有更好的选择,而是这样做: 但这可以实现我在使用unlatch.FaultBits.Value[0]时想要的东西吗? (Vaule []是结构体中的数组:
3回复

为什么C和C ++非常讨厌签名char?

为什么C允许使用“字符类型”访问对象: 6.5表达式 (C) 对象的存储值只能由具有以下类型之一的左值表达式访问: 一个字符类型。 但C ++只允许char和unsigned char ? 3.10左值和右值 (C ++) 如果程序试
4回复

连接字符*

我如何相互连接char *字符串。 例如: 我如何将它们连接到一个应该等于“直升机”的字符?
14回复

应该使用字节缓冲区来签名还是使用unsigned char缓冲区?

字节缓冲区应该是char或unsigned char还是char缓冲区? C和C ++之间有什么区别吗? 谢谢。
7回复

const char *是指向单个字符还是字符串?

我有一个简单的问题,关于如何声明一个指向单个字符的char指针。 是char*可以指向单个字符还是字符串。 如果我错了,请纠正我。
6回复

用两个旧字符*创建一个新字符*

我愿意使用中间C ++代码,尽管C代码是首选。 我有如下代码: 我想创建一个新的char*变量,名为fileName1WithExtension1 ,它对应于“ graph.eps”,由上面给出的两个char*变量组成。 如何才能做到这一点?