如果在给定的情况下,您有一个字符数组(当然以空字符结尾),紧接着在内存中的下一个位置,您想将其存储0
为 unsigned int,计算机如何区分这些二?
Jam*_*han 87
它没有。
字符串终止符是一个包含所有 0 位的字节。
unsigned int 是两个或四个字节(取决于您的环境),每个字节都包含所有 0 位。
这两个项目存储在不同的地址。您编译的代码在前一个位置执行适合字符串的操作,在后者执行适合无符号二进制数的操作。(除非你的代码中有错误,或者一些危险的聪明代码!)
但是所有这些字节在 CPU 看来都是一样的。内存中的数据(在大多数当前常见的指令集架构中)没有任何类型与之关联。这是一个只存在于源代码中的抽象,并且只对编译器有意义。
编辑添加:例如:对组成字符串的字节执行算术运算是完全可能的,甚至是常见的。如果您有一个 8 位 ASCII 字符的字符串,您可以通过加减 32(十进制)将字符串中的字母在大小写之间转换。或者,如果您要转换为另一个字符代码,您可以将它们的值用作数组的索引,该数组的元素在其他代码中提供等效的位编码。
对于 CPU 而言,字符实际上是超短整数。(每个 8 位,而不是 16、32 或 64。)对我们人类来说,它们的值碰巧与可读字符相关联,但 CPU 不知道这一点。它也对“空字节结束字符串”的“C”约定一无所知(并且正如许多人在其他答案和评论中指出的那样,在某些编程环境中根本不使用该约定) .
可以肯定的是,x86/x64 中有一些指令经常与字符串一起使用 - 例如 REP 前缀 - 但如果它们达到预期的结果,您也可以在整数数组上使用它们。
简而言之,没有区别(除了 int 为 2 或 4 个字节宽,而 char 仅为 1)。
问题是所有现代库要么使用空终止符技术,要么存储字符串的长度。在这两种情况下,程序/计算机在读取空字符或读取了大小告诉它的字符数时都知道它到达了字符串的末尾。
当空终止符丢失或长度错误时,这个问题就开始了,因为程序开始从它不应该的内存中读取。
归档时间: |
|
查看次数: |
8737 次 |
最近记录: |