1

我在 C++ 中看到很多代码,它们char用来表示小于 256 的数字。

这些应该unsigned char代替char吗?

如果我这样做会怎样?

char t = 255;

我记得我在某个地方读到,说 char 对标志很特别。

4

4 回答 4

2

char是与有符号和无符号版本不同的类型,可以是有符号或无符号的。如果你想要一个特别有符号或无符号的字节/字符,你确实应该在你的变量声明中指定它。

于 2013-05-30T01:42:34.633 回答
2

是的,char可以有符号或无符号 [basic.fundamental],由编译器(“C++ 实现”)来选择(*)。如果它已签名,则不能保证它可以保存 value 255,并且在它不能保存 value 的情况下255,转换会导致实现定义的值 [conv.integral]。

unsigned char保证至少有 8 位(以及charand signed char),这条线很好unsigned char t = 255;

(*) 这并不意味着, typedef signed char char;as char,signed char并且unsigned char必须是三种不同的类型 [basic.fundamental]/1。

于 2013-05-30T01:43:56.547 回答
0

严格来说,这取决于所讨论的目标中有多少位char。您是对的,对于具有带符号 8 位char类型的普通 2 的补码机器,他们可能应该使用unsigned char.

如果发生从有符号到无符号的转换,则根据 C++ 规范(4.7 积分转换)进行了明确定义:

2 如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模 2 n,其中n是用于表示无符号类型的位数)。[注意:在二进制补码表示中,这种转换是概念性的,位模式没有变化(如果没有截断)。——尾注]

然而,从无符号到有符号的转换是实现定义的:

3 如果目标类型是有符号的,如果它可以在目标类型(和位域宽度)中表示,则值不变;否则,该值是实现定义的。

但在实践中,大多数系统都按照您的预期工作,一切顺利。也就是说,有符号溢出就像无符号溢出一样工作,无论有符号->无符号还是无符号->有符号转换等,位模式都不会改变。

于 2013-05-30T01:44:05.253 回答
0

该标准没有指定普通的“char”是有符号的还是无符号的。它由编译器决定。在 GCC 中,它默认是签名的,但可以用 指定,-funsigned-char/-fsigned-char同样在 MSVC 中,默认是有符号的,但可以强制用 无符号/J

于 2013-05-30T01:49:55.197 回答