如果在给定的情况下,您有一个char数组(当然以null字符结尾),然后紧接着,在内存中的下一个位置,您想存储0
为unsigned int,计算机如何区分这些字符?二?
pic X occurs m to n depending on v
(并且计数可以在任何地方,不仅是紧接之前),但存储起来更复杂。
如果在给定的情况下,您有一个char数组(当然以null字符结尾),然后紧接着,在内存中的下一个位置,您想存储0
为unsigned int,计算机如何区分这些字符?二?
pic X occurs m to n depending on v
(并且计数可以在任何地方,不仅是紧接之前),但存储起来更复杂。
Answers:
没有。
字符串终止符是一个包含所有0位的字节。
unsigned int是两个或四个字节(取决于您的环境),每个字节包含所有0位。
两项存储在不同的地址。您编译的代码在前者的位置执行适合于字符串的操作,在后者的位置执行适合于无符号二进制数的操作。(除非您的代码中有错误或某些危险的聪明代码!)
但是所有这些字节在CPU上看起来都是相同的。内存中的数据(在大多数当前常见的指令集体系结构中)没有任何关联的类型。那是仅存在于源代码中的抽象,仅对编译器有意义。
编辑添加:作为示例:完全有可能,甚至很常见,对组成字符串的字节执行算术运算。如果您有一串8位ASCII字符,则可以通过添加或减去32(十进制)在字符串中的字母转换为大写和小写形式。或者,如果要转换为另一个字符代码,则可以将它们的值用作数组中的索引,该数组的元素提供其他代码中的等效位编码。
对于CPU来说,字符实际上是超短整数。(每位8位,而不是16位,32位或64位。)对我们来说,它们的值恰好与可读字符相关联,但CPU对此一无所知。它也对“空字节结束字符串”的“ C”约定一无所知(正如许多其他答案和评论所指出的那样,在编程环境中根本没有使用该约定) 。
可以肯定的是,x86 / x64中有一些指令经常与字符串一起使用-例如REP前缀-但是,如果它们能达到期望的结果,则也可以在整数数组上使用它们。
简而言之,没有区别(除了int的宽度为2或4个字节,而char仅为1)。
事实是,所有现代库都使用空终止符技术或存储字符串的长度。在这两种情况下,程序/计算机在读取空字符或读取的字符数与大小指示的字符数相同时,都知道它已到达字符串的末尾。
当缺少空终止符或长度错误时此问题就开始了,然后程序开始从不应有的内存中读取数据。
科学的单字答案将是:元数据。
元数据告诉计算机某个位置的某些数据是整数,字符串,程序代码还是其他。此元数据可以是程序代码的一部分(如Jamie Hanrahan所述),也可以显式存储在某个地方。
现代CPU通常可以区分分配给程序代码的存储区域和数据区域(例如NX Bit https://en.wikipedia.org/wiki/NX_bit)。某些特殊的硬件也可以区分字符串和数字,是的。但是通常的情况是,软件会通过隐式元数据(在代码中)或显式元数据(面向对象的VM通常将元数据(类型/类信息)存储为数据(对象)的一部分)来解决此问题。 。
不区分不同类型的数据的优点是某些操作变得非常简单。I / O子系统不一定需要知道它刚刚从磁盘读取或写入磁盘的数据实际上是程序代码,人类可读的文本还是数字。所有这些都是通过机器传输的。让程序代码处理花哨的打字问题。
没有。你做吧!
或您的编译器/解释器。
如果说明告诉计算机将数字添加0
为数字,它将执行该操作。如果他们告诉计算机在到达字符后停止打印数据,将其0
作为' \0'
字符,它将执行此操作。
语言具有确保如何处理数据的机制。在C变量具有类型,如int
,float
和char
,和编译器产生每个数据类型正确的指示。但是C允许您将数据从一个变量强制转换为另一个不同类型的变量,甚至可以将指针用作数字。对于计算机来说,所有其他方面都一样。