【问题标题】:How does memory determine data type of variable? [duplicate]内存如何确定变量的数据类型? [复制]
【发布时间】:2017-01-05 11:41:57
【问题描述】:

假设我将这个值存储在我的内存中,内存将如何确定这是字符串还是 int。数据类型如何存储在内存中

【问题讨论】:

标签: c memory assembly


【解决方案1】:

假设我有这个值存储在我的内存中,内存将如何确定这是字符串还是 int

没有。

数据类型如何存储在内存中

如果存储类型信息以及如何存储完全取决于所使用的编程语言和运行时环境。我知道的所有 C 实现(编译器和标准库)将数据类型与值一起存储。其他编程语言和 rumtimes 都可以。

但是对于 C 来说,如何解释内存内容完全由程序决定,即对特定内存位置的内容执行的机器级操作。程序员(你)不要对编译器撒谎,告诉他们在内存位置可以找到什么。

【讨论】:

【解决方案2】:

内存无需知道存储的数据类型和位置。内存只是将值存储在带有地址的块中。

确定类型并从内存中获取适当的数据是编译器的工作。

【讨论】:

    【解决方案3】:

    位就是位。就内存而言,它不仅没有特定的类型,它还可以同时具有多种类型。类型的概念大多只与人类相关,有时与逻辑相关,但与记忆无关。

    您可能有一个程序,其中您有一个地址变量,可以说是结构的基地址。但是,当您想访问该结构中的某个项目时,会从您人类识别为地址位的内存中收集一些位,但随后它们会进入执行加法的逻辑,以便您认为是结构的偏移量可以是计算。该加法器仅将这些位视为操作数,无论是有符号还是无符号,加法器都不知道差异,这要归功于二进制补码,加法是执行的,在您的脑海中,这些位是地址,但从逻辑上讲,它们只是位,也许登陆寄存器,或者可能只是寄存器+偏移加载或存储指令中的一步。这些位可能需要通过 mmu 才能从虚拟转换为物理。这些位不仅仅是表中的偏移量,更多的是数学运算,操作数到加法器中,然后一些位被替换以使它们成为物理地址,您认为是地址的大多数位现在都消失了,被替换了。

    在小学时,我有一支铅笔,实际上很多,但在某一天,我可以想象一支铅笔。在去学校的公共汽车上,我坐在口袋里的腿可能会很痛。也许那支铅笔后来变成了背部刮板。或者也许像狗骨头一样咬东西。然后最终它可能被用来写下拼写单词,一支英文铅笔。然后在数学课上,它被用来加数字,加法铅笔。美术课做美术,美术铅笔。科学。历史等。就像内存中的位一样,通用,只有在一个时钟周期内使用它们的上下文将它们通过逻辑定义为其他东西,然后它们又只是位。

    【讨论】:

      【解决方案4】:

      如前所述:它没有。此任务取决于编译器和程序员。 一方面,这可能导致程序错误,但另一方面,这可能会导致一些技巧,例如:

      //Change a lowercase Character to uppercase character:
      char x = 'a';
      printf("%c\n", x);
      x += 32;
      printf("%c\n", x);
      

      【讨论】:

      • 使用联合的双关语是一个更好的例子。 IMO,这并没有表现出任何特别之处。 char 已经是一个包含字符值的整数类型,而'a' 在任何平台的本机字符编码中都是一个字符常量。 (您假设是 ASCII,而不是 EBCDIC 或其他东西。当然,任何重新解释值表示的位的行为总是不可移植的,例如使用整数运算来翻转 IEEE float 的符号位。 )。
      • 嗯,你是对的。只是我想到的最简单的例子
      • 我认为这根本不是一个例子。 char 只是一个整数类型,所以添加 32 并不奇怪或特殊。
      猜你喜欢
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 2018-04-27
      • 2015-04-21
      • 2019-04-26
      • 1970-01-01
      • 2010-09-28
      • 2021-05-03
      相关资源
      最近更新 更多