【问题标题】:What is the purpose of Signed Char签名字符的目的是什么
【发布时间】:2011-08-09 13:51:10
【问题描述】:

如果 char 和 signed char 的范围都在 -127 到 127 之间,那么 signed char 的用途是什么? 我们在哪里使用signed char 而不是char?

【问题讨论】:

  • 谁说 char 的范围是 -127 到 127?甚至signed char 也没有那个范围。
  • 8 位有符号字符为 -128 到 +127。
  • @Flinsch:仅当CHAR_BIT 等于8
  • @R. Martinho Fernandes:是的,正是这样。 -127 到 127 是signed char 的最小允许范围。 不需要来表示-128。显然,如果它是 2 的补码,那么它确实如此。由于 2 的补码几乎无处不在,人们倾向于将其视为有保证的,但事实并非如此。
  • 为了补充史蒂夫所说的(megalols):[2003: 3.9.1/7]“bool、char、wchar_t 类型以及有符号和无符号整数类型统称为整数类型。同义词对于整数类型是整数类型。整数类型的表示应使用纯二进制计数系统定义值。[示例:本国际标准允许整数类型的 2 的补码、1 的补码和有符号幅度表示。]"

标签: c++ c


【解决方案1】:
  • unsigned char 未签名。

  • signed char 已签名。

  • char 可能未签名签名,具体取决于您的平台。

如果您确实需要签名,请使用 signed char

可能相关:What does it mean for a char to be signed?

【讨论】:

  • +1 ... 至少取决于您的平台、编译器和编译器选项。
  • 再想一想……平台本身与普通字符的解释方式无关:它只是编译器及其选项的一个函数。
  • @pmg:我想我的平台意思是“开发环境”;不赘述,我认为它会作为一个包罗万象的。
  • 严格来说应该可以只说“实现”。但是,当人们意识到 gccgcc -funsigned-char 可能应该被视为不同的实现时,这同样令人困惑。它是平台特有的功能,因为它可能影响 ABI。虽然通常不会,但由于使用 2 的补码,您可以将相应的有符号和无符号类型视为相同,因此平台可以释放编译器来执行任何操作。所以我会说它绝对取决于它所依赖的所有东西:-)
  • 非常正确。在 ARM 平台上,char 默认是无符号的。
【解决方案2】:

plain char 是否使用相同的实现定义 表示为signed charunsigned charsigned char 是 引入的原因是普通的char 未指定。还有 您发送给读者的信息:

  • char:字符数据
  • signed char: 小迭代器
  • unsigned char: 原始内存

(unsigned char 如果您按位进行很多操作,也可以使用 操作。在实践中,这往往与原始内存重叠 使用。)

【讨论】:

  • +1 为了准确地理解它们的含义,实用的关于它们的使用和你的引导笔记彻底。
【解决方案3】:

见拉米亚,

首先,我想为您的问题准备背景。
...................................................

char 数据类型有两种:

无符号字符;

签名字符;

(即积分数据类型)

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

根据不同的书籍解释为:
char 1byte –128 到 127(即默认为有符号字符)

有符号字符 1byte –128 到 127

无符号字符 1 字节 0 到 255


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

还有一件事 1byte=8 位。(零到第 7 位)

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

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

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


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

类似地,char 的最后一位默认被视为已签名

这是为什么?

因为 char 还依赖于特定字符的 ASCII 码(例如 A=65)。

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

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

感谢您的提问。

【讨论】:

    【解决方案4】:

    请注意,在许多系统上,charsigned char

    至于你的问题:嗯,当你需要一个小的签名号码时,你会使用它。

    【讨论】:

    • char从不 signed char。它们是两种不同的类型。然而,在许多系统上,char 有一个有符号的底层表示,这使得它们实际上可以互换。
    • 请注意,Tomalak 评论中的实际考虑是 C 在char *signed char * 之间没有隐式转换。您必须始终明确地强制转换或转换为 void * 并让编译器进行第二次转换。
    • 另请注意,大多数编译器都无法强制执行此操作并最多发出警告。这是错误的。
    • @R..:发出警告是符合标准所需的全部内容,大概你的意思是道德上的错误?
    • 我想我有点搞砸了。从技术上讲,问题在于他们“最多”发出警告。它应该是“至少”,即警告应该总是在没有任何-W 选项的情况下发出,并且可以选择(最好)一个错误。 在道德上,当然,警告应该是用于可能表明编程错误的可疑用法,而诸如约束违规之类的内容只是简单的无效 C 而无需分析程序流程应该是错误。 :-)
    猜你喜欢
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多