如果在特定情况下,您有一个字符数组(当然以空字符结尾),并且紧接着,在内存中的下一个位置,您想将其存储0
为无符号整数,那么计算机如何区分这两者?
答案1
但事实并非如此。
字符串终止符是一个包含全 0 位的字节。
无符号整数是两个或四个字节(取决于您的环境),每个字节全为 0 位。
这两个项目存储在不同的地址。编译后的代码在前一个位置执行适合字符串的操作,在后一个位置执行适合无符号二进制数的操作。(除非您的代码中有错误,或者某些危险的聪明代码!)
但所有这些字节在 CPU 看来都一样。内存中的数据(在大多数当前常见的指令集架构中)没有任何与之关联的类型。这是一种仅存在于源代码中的抽象,仅对编译器有意义。
编辑添加:例如:对组成字符串的字节进行算术运算是完全可能的,甚至是常见的。如果您有一个 8 位 ASCII 字符的字符串,则可以通过加或减 32(十进制)将字符串中的字母转换为大写和小写。或者,如果您要转换为另一个字符代码,则可以将它们的值用作数组的索引,该数组的元素在另一个代码中提供等效的位编码。
对于 CPU 来说,字符实际上是超短整数。(每个字符有 8 位,而不是 16、32 或 64 位。)对于我们人类来说,它们的值恰好与可读字符相关联,但 CPU 对此一无所知。它也不了解“空字节结束字符串”的“C”约定(正如许多人在其他答案和评论中指出的那样,有些编程环境根本不使用该约定)。
可以肯定的是,x86/x64 中有一些指令往往与字符串一起使用 - 例如 REP 前缀 - 但如果它们实现所需的结果,您也可以在整数数组上使用它们。
答案2
简而言之,没有区别(除了 int 有 2 或 4 个字节宽,而 char 只有 1 个字节宽)。
问题是,所有现代库要么使用空终止符技术,要么存储字符串的长度。在这两种情况下,当程序/计算机读到一个空字符或读到的字符数达到大小要求的数目时,它就知道它已经到达字符串的末尾。
当缺少空终止符或长度错误时,就会出现问题,因为程序会开始从不应该读取的内存中读取数据。
答案3
没有区别。机器代码(汇编程序)没有变量类型,而是数据的类型由指令决定。
一个更好的例子是int
和float
,如果内存中有 4 个字节,那么就没有关于它是int
或float
(或完全不同的东西)的信息,但是有 2 个不同的整数加法和浮点加法指令,所以如果在数据上使用整数加法指令,那么它就是一个整数,反之亦然。
与字符串相同,如果您有代码,比如查看一个地址并计算字节数直到达到一个\0
字节,您可以将其视为计算字符串长度的函数。
当然,这样的编程是完全疯狂的,所以这就是为什么我们有编译为机器代码的高级语言,而几乎没有人直接用汇编语言编程。
答案4
没关系。你来做吧!
或者您的编译器/解释器。
如果指令告诉计算机将 作为一个数字添加,它就会执行。如果指令告诉计算机在达到(作为一个 '字符0
)后停止打印数据,它就会执行。0
\0'
语言有机制来确保如何处理数据。在 C 语言中,变量有类型,如int
、float
和char
,并且编译器会为每种数据类型生成正确的指令。但是 C 语言允许你将数据从一个变量转换为另一个不同类型的变量,甚至指向的指针也可以用作数字。对于计算机来说,它们都是像其他任何位一样的位。