【问题标题】:Why do we have the type of char in C, if a character literal is always of type int? Isn´t the whole type of char in C redundant?如果字符文字总是 int 类型,为什么我们在 C 中有 char 类型? C中的整个类型的char不是多余的吗?
【发布时间】:2019-12-23 15:03:07
【问题描述】:

与 C++ 不同,在 C 中,字符文字被实现为始终为 int 类型。


但是为什么我们有 char 的类型来保存一个字符值呢?


在问题Why are C character literals ints instead of chars?

讨论过,为什么字符文字在 C 中属于 int 类型。但这不是我的问题所在。

If character constants are of type `int', why are they assigned to variables of type `char`? 的问题中,这个问题更深入一点,为什么我们实际上将字符文字分配给char 类型的变量,如果它们是int 类型的变量,但提供的答案留下了关注点,为什么我们通常需要char 的类型。


我现在的问题是:

  • 如果任何字符文字总是int 类型,为什么我们有char 类型?
  • 那么char 的类型不是多余的吗?
  • char 类型的目的是什么,如果它看起来是多余的?

【问题讨论】:

  • 如果char类型不存在,你将如何声明一个字符数组?
  • @VladfromMoscow 整个char 类型的概念现在对我来说似乎不正确。对我来说,需要在这个主题上定义不同的语言,提供修饰符或类似的东西,向编译器标记上下文(如果需要)是关于文字字符而不是通常的整数值, 通过使用 int 类型。
  • char 类型和文字 char 常量是 2 个独立的实体,其尺寸根据标准定义为系统上可用的最小内存单元,第一个,标准 @987654337 @ 输入第二个。任何试图在 char 类型和 char 文字(即 'abc')之间进行等价的尝试在形式上都是不正确的。
  • 一个字符在不同的机器上可以有不同的维度,8、16甚至32位,字符文字和char变量之间的赋值意味着从intchar的类型转换.
  • re 在 C 中,literal 存在于某个内存位置,因此它有一个地址。研究字符串文字复合文字。像'A' 这样的常量不需要存在于地址中 - 例如可以是可执行代码中的一个值。

标签: c types char character language-lawyer


【解决方案1】:

仅仅因为 C 源代码中的 字符常量 具有类型 int 并不意味着 类型 char 没有用处。

char 类型占用 1 个字节的空间。因此,您可以在值在 char 范围内的任何地方使用它,其中包括 ASCII 字符。您可以从控制台或文件作为单字节实体读取和写入这些字符。源代码中的字符常量具有不同类型这一事实并不会改变这一点。

在数组中使用char 也意味着您使用的内存比使用int 数组时更少,这在空间非常宝贵的情况下很有用。如果您使用它作为二进制格式在磁盘上存储数据或通过网络发送数据,则尤其如此。

char * 也可用于访问任何对象的各个字节,如果您需要查看该对象的表示方式。

【讨论】:

  • ...但请注意,当将 char 作为参数传递给函数时,它首先会转换为 int,可能是因为没有机器可以将单个字节放入堆栈。
  • @PaulOgilvie 从 ABI 的角度来看是的,但是从 language 的角度来看,char 类型的变量传递给期望 char 类型参数的函数不会被转换。
  • @PaulOgilvie 这不是真的。大多数 8 位微控制器可以将单个字节放在堆栈上和/或使用寄存器将它们作为参数传递。
  • @PaulOgilvie “请注意,当 char 作为参数传递给函数时,它首先会转换为 int”——只有在没有原型的情况下才是正确的。如果有原型,则char 可能会或可能不会像int 那样在堆栈上占用尽可能多的字节,具体取决于调用序列定义。 “可能是因为没有机器可以将单个字节放在堆栈上” - 不,这不是真的,并且与为什么 charshort 在没有的情况下转换为 int 无关一个原型。 (而 dbush 的评论毫无意义。)
  • @dbush 字符常量和ASCII字符有区别吗?我以为他们会是一样的。
【解决方案2】:

char 类型允许寻址每个字节(CPU 的最小可寻址单元)。因此,例如,它允许指定任意字节数的内存范围,例如用于 memcpy 或 memmove。

还有如何声明一个没有char类型的字符数组?

如果将其声明为整数数组,则会有冗余分配的内存。

【讨论】:

    【解决方案3】:

    如果字符文字总是int 类型,为什么我们在C 中有char 类型?

    char, unsigned, char, signed char 是最小尺寸的对象。字符 literal constantsint 类型,以简化语言,否则没有强烈需求。 (C++ 选择了不同的路径——计算机可以在 20 年后处理更复杂的事情。)没有比 int 更窄的整数常量。

    C 中 char 的整个类型不是多余的吗?
    如果任何字符文字总是int 类型,为什么我们有char 类型?
    那么char的类型不是多余的吗?

    没有。对象大小受益于各种大小,常量则较少。

    char 类型的目的是什么,如果它看起来是多余的?

    关于int 和常量,char 不是多余的。关于signed charunsigned charchar 是多余的,它反映了char 早期实现的妥协为unsignedsigned。这允许char有符号(这是对称的其他整数类型,缺少signed无符号,因为概念上的字符通常被认为是。


    如果需要“char`literal”,代码可以形成char 类型的compound literal

    char a = (char){'B'};
    

    【讨论】:

      猜你喜欢
      • 2017-11-03
      • 1970-01-01
      • 2012-12-28
      • 2021-01-08
      • 2021-12-07
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多