C 内存如何确定变量的数据类型?

C 内存如何确定变量的数据类型?,c,memory,assembly,C,Memory,Assembly,假设我把这个值存储在内存中,内存将如何确定它是字符串还是int。数据类型是如何存储在内存中的 假设我在内存中存储了这个值,内存将如何确定它是string还是int 没有 数据类型如何存储在内存中 是否存储类型信息以及如何存储完全取决于所使用的编程语言和运行时环境。我所知道的所有C编译器和标准库的实现都不会将数据类型与值一起存储。其他编程语言和语言都可以 但在C语言中,如何解释内存内容完全取决于程序,即对特定内存位置的内容执行的机器级操作。这取决于程序员,你不能在内存位置上对编译器撒谎 假设我在内

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

假设我在内存中存储了这个值,内存将如何确定它是string还是int

没有

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

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

但在C语言中,如何解释内存内容完全取决于程序,即对特定内存位置的内容执行的机器级操作。这取决于程序员,你不能在内存位置上对编译器撒谎

假设我在内存中存储了这个值,内存将如何确定它是string还是int

没有

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

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


但在C语言中,如何解释内存内容完全取决于程序,即对特定内存位置的内容执行的机器级操作。至于内存位置中可以找到什么,这取决于程序员,你不能对编译器撒谎。

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


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

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


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

如前所述:它没有。这项任务由编译器和程序员来完成。 一方面,这可能会导致程序故障,但另一方面,这会导致一些技巧,如:

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

如前所述:事实并非如此。这项任务由编译器和程序员来完成。 一方面,这可能会导致程序故障,但另一方面,这会导致一些技巧,如:

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

比特就是比特。就内存而言,它不仅没有特定的类型,而且可以同时拥有多种类型。类型的概念主要只与人有关,有时与逻辑有关,但与记忆无关

您可能有一个程序,其中有一个变量,它是一个地址,也就是一个结构的基址。但是当你想要访问那个结构中的一个条目时,从你记忆中的一些位元被收集起来,那就是你人类所识别的地址位,但是它们进入逻辑,做加法运算,这样可以计算出你认为是一个结构的偏移量。加法器只将这些位视为操作数,既不带符号也不带符号,因为加法器不知道二者之间的差异多亏了两个补码,加法是执行的,在你的头脑中,这些位是地址,但在逻辑上,它们只是位,可能在寄存器中登陆,或者可能只是寄存器+偏移加载或存储指令中的一步。这些位可能需要经过mmu才能从虚拟转换为物理。这些位不仅仅是表中的偏移量,更重要的是,将操作数放入加法器,然后一些位被替换成物理地址,你认为是地址的大部分位现在都消失了,被替换了


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

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

您可能有一个程序,其中有一个变量,它是一个地址,也就是一个结构的基址。但是,当你想访问该结构中的一个项目时,一些位是从你人类识别为 DWADE位,但他们进入逻辑,做加法,以便偏移到你认为是一个结构可以计算。加法器只将这些位视为操作数,既不带符号也不带符号,因为加法器不知道二者之间的差异多亏了两个补码,加法是执行的,在你的头脑中,这些位是地址,但在逻辑上,它们只是位,可能在寄存器中登陆,或者可能只是寄存器+偏移加载或存储指令中的一步。这些位可能需要经过mmu才能从虚拟转换为物理。这些位不仅仅是表中的偏移量,更重要的是,将操作数放入加法器,然后一些位被替换成物理地址,你认为是地址的大部分位现在都消失了,被替换了


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

听说过MSB/LSB…什么是MSD?@SouravGhosh我假设D代表数字。这并没有错,只是不寻常。@SouravGhosh MSB/LSB将显示其已签名或未签名,但数据类型将如何进行数据挖掘?@AyazAhmadTarar它不显示其是否已签名。可能重复,请参见也听说过MSB/LSB…什么是MSD?@SouravGhosh我假设D代表数字。这并不是错的,只是不寻常。@SouravGhosh MSB/LSB将显示其有符号或无符号,但数据类型将如何被挖掘?@AyazAhmadTarar它不显示它是有符号还是无符号。可能的重复,另请参见使用联合的类型punning是一个更好的示例。这并没有说明什么特别的地方,依我看,char已经是一个整数类型,它保存字符值,“a”是一个字符常量,无论平台的本机字符编码是什么。你假设的是ASCII码,而不是EBCDIC之类的。当然,重新解释值表示的位的任何乱七八糟的做法都是不可移植的,就像使用整数操作翻转IEEE浮点的符号位一样……嗯,你说得对。这只是我想到的最简单的例子我认为这根本不是一个被谈论的例子。char只是一个整数类型,因此在其中添加32并不奇怪或特殊。使用并集进行类型双关是一个更好的例子。这并没有说明什么特别的地方,依我看,char已经是一个整数类型,它保存字符值,“a”是一个字符常量,无论平台的本机字符编码是什么。你假设的是ASCII码,而不是EBCDIC之类的。当然,重新解释值表示的位的任何乱七八糟的做法都是不可移植的,就像使用整数操作翻转IEEE浮点的符号位一样……嗯,你说得对。这只是我想到的最简单的例子我认为这根本不是一个被谈论的例子。char只是一个整数类型,因此在其中添加32并不奇怪或特殊。这就是为什么C被称为静态类型语言:所有类型信息在编译时都是已知的,而不是动态确定的。与C++的动态类型转换相比,这就是为什么C被称为静态类型语言:所有类型信息在编译时都是已知的,而不是动态确定的。与C++的动态_cast相比,