【问题标题】:how an integer and character is stored in c整数和字符如何存储在 c 中
【发布时间】:2018-06-13 10:54:42
【问题描述】:
#include<stdio.h>
void main()
{
  int a=65;
  char d='A';
   if(a==d)
    printf("both are same");
 }

输出都是相同的。这里 a 是一个整数,所以 65 存储在 32 位中,d 是一个 char,它存储在 8 位中,它们如何与计算机相同,所有操作都转换为二进制。

【问题讨论】:

    标签: c char int interpretation


    【解决方案1】:

    由于Implicit type promotion rules,计算机能够在二进制级别上将 char 与 int 进行比较。

    如果 int 可以表示原始类型的所有值(受宽度限制,对于位域),则该值将转换为 int;否则,它将转换为无符号整数。这些称为整数促销。

    这意味着在您的处理器比较两者之前,您的 char 被提升为 int

    【讨论】:

      【解决方案2】:

      C 是一种非常有缺陷的语言,所以这里的字里行间有很多肮脏、不合理的事情:

      • char 具有实现定义的签名,因此它如何存储数据取决于编译器。 Is char signed or unsigned by default?
      • 'A' 是一个字符文字,碰巧的是,字符文字实际上是 C 中的 int 类型。这没有任何意义,但就是这样。
      • char d='A'; 行中,文字'A'(类型int)被转换为char。可能会或可能不会签署。但实际上,签名不应该影响基本字符集 A 到 Z。
      • 很可能'A' 将存储为值65,尽管标准不保证这一点。出于这个原因,最好总是写 'A' 而永远不要写 65(前者也是最易读的)。
      • 在表达式a==d 中,字符操作数是小整数类型。在大多数表达式中使用时,小整数类型会隐式提升为 int。此整数提升是一组关于如何平衡表达式的规则的一部分,以确保运算符的两个操作数始终属于同一类型。这些规则称为通常的算术转换。详情见:Implicit type promotion rules

      【讨论】:

        【解决方案3】:

        内部存储由编译器决定,通常取决于目标架构。

        但是,这与您的代码显示的结果无关;在比较中, char 在比较之前被提升为 int (因为您无法将苹果与橙子进行比较;请阅读语言规则)。因此,它将一个 int 与一个 int 进行比较,它们是相等的。

        【讨论】:

        • 您的回答表明您不能将苹果与橙子进行比较,但您可以将苹果变成橙子 - 无意冒犯 :-)
        • @andreee 更准确的类比可能是:
        • 想象一下 C 编译器是一个水果仓库工人,负责比较 3 个苹果和 5 个橙子。工人不愿意承认请求的任务没有意义,更不用说他不了解比较标准。因此,工人取而代之的是 3 根香蕉和 5 根香蕉,然后偷偷溜进另一个房间,将香蕉相互比较。啊哈,他们都是黄色的。他对自己感到满意,然后将香蕉交付给客户,然后客户试图将它们作为苹果出售。之后,水果店破产了。于是发明了“走香蕉”这个词。
        猜你喜欢
        • 1970-01-01
        • 2014-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-21
        • 1970-01-01
        相关资源
        最近更新 更多