Signed Char的目的是什么?

5

如果char和signed char的范围都是-127至127,那么signed char的目的是什么?我们在什么情况下使用signed char而不是仅使用char?


3
谁说 char 的范围是从 -127 到 127?即使是 signed char 也没有这个范围。 - R. Martinho Fernandes
2
@Flinsch:只有当CHAR_BIT等于8时才成立! - Lightness Races in Orbit
4
是的,完全就是这个意思。-127到127是“signed char”允许的最小范围。它不需要表示-128。当然,如果是2的补码,那么它会表示-128。由于2的补码几乎无处不在,人们往往将其视为保证,但实际上并非如此。 - Steve Jessop
1
为了补充Steve所说的(超级好笑):[2003: 3.9.1/7]“类型bool、char、wchar_t以及有符号和无符号整数类型被称为整数类型。整数类型的同义词是整型。整数类型的表示应使用纯二进制计数系统来定义值。[例如:这个国际标准允许使用2的补码、1的补码和带符号的幅度表示整数类型。]" - Lightness Races in Orbit
可能是Is char signed or unsigned by default?的重复问题。 - Ciro Santilli OurBigBook.com
显示剩余9条评论
4个回答

19
  • unsigned char是无符号的。

  • signed char是有符号的。

  • char可能是无符号的或有符号的,这取决于您使用的平台。

当您确实需要有符号性时,请使用signed char

可能相关的问题:char带有符号表示什么意思?


+1 ... 取决于您的平台、编译器和编译器选项。 - pmg
再仔细思考一下...平台本身与如何解释普通字符没有关系:这只是编译器及其选项的功能。 - pmg
@pmg:我想说的“平台”指的是“开发环境”;不详细说明,我认为这个术语可以作为一个总称。 - Lightness Races in Orbit
严格来说,你应该只需要说“实现”。但是当人们意识到gccgcc -funsigned-char可能被认为是不同的实现时,这同样令人困惑。它在平台上是一个特定的函数,因为它可能会影响ABI。虽然通常情况下不会,因为使用2的补码可以将相应的有符号和无符号类型视为相同,所以平台释放了编译器去做任何事情。所以我会说它绝对取决于所有它所依赖的东西 :-) - Steve Jessop
@Steve:这就是为什么在“公共”API中使用“char”作为一部分的想法很愚蠢。 - Lightness Races in Orbit
显示剩余3条评论

7

对于普通的char,它是否使用与signed charunsigned char相同的表示法是实现定义的。因为普通的char没有明确定义,所以引入了signed char。此外,你需要向读者传达以下信息:

  • 普通的char:字符数据
  • signed char:小整数
  • unsigned char:原始内存

(如果你要执行大量位运算,也可以使用unsigned char。但在实践中,这往往与原始内存使用重叠。)


+1 因为你在表达意思方面非常准确,使用方法非常实用,并且在注释方面非常详尽。 - Lightness Races in Orbit

2

看到lamia,

首先我要为你的问题做一些背景准备。
................................................

char数据类型有两种类型:

无符号字符;

有符号字符;

(即整数数据类型)

................................................

不同书籍的解释如下:
char 1字节 -128到127(即默认为有符号字符)

signed char 1字节 -128到127

unsigned char 1字节 0到255

................................................

还有一件事,1字节=8位(零到第7位)

由于处理器标志寄存器保留第7位来表示符号(即1=+ve和0=-ve)

-37将被表示为1101 1011(最高有效位为1),

+37将被表示为0010 0101(最高有效位为0)。

................................................

类似地,对于字符,最后一位默认为有符号位

为什么?

因为字符也取决于特定字符(例如A=65)的ASCII码。

在任何情况下,我们都使用char并仅使用7位。

在这种情况下,为了将char / int的内存范围增加1位,我们使用无符号char或无符号int;

感谢您的问题。


1
请注意,在许多系统中,charsigned char
至于你的问题:当你需要一个小的有符号数字时,你会使用它。

1
char 永远不会signed char。它们是两个独立的类型。然而,在许多系统上,char 具有带符号的底层表示,使它们在实践中可以互换。 - Lightness Races in Orbit
2
请注意,Tomalak评论中的实际考虑是,C语言char *signed char *之间没有隐式转换。您必须始终进行显式或转换为void *并让编译器执行第二次转换。 - R.. GitHub STOP HELPING ICE
还要注意的是,大多数编译器无法强制执行此规则,最多只会发出警告。这是错误的。 - R.. GitHub STOP HELPING ICE
1
@R..:发出警告就足以符合标准,你想说的是道德上的错误吗? - Steve Jessop
我想我有点搞砸了。从技术上讲,问题在于他们只发出“最多”一个警告。应该是“至少”,即警告应始终在没有任何“-W”选项的情况下发出,并且可选地(最好)是一个错误。当然,“道德上”,警告应该用于可能表示编程错误的可疑用法,以及像约束违规这样的无需分析程序流程就是无效C的事情应该是错误。 :-) - R.. GitHub STOP HELPING ICE
先生,如果我执行 unsigned char a = 12signed char a = 12,存储的位模式有什么区别? - Suraj Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接