c - ASCII 字符串和字节顺序

标签 c ascii endianness

一位与我一起工作的实习生向我展示了他在计算机科学领域参加的关于字节顺序问题的考试。有一个显示 ASCII 字符串“My-Pizza”的问题,学生必须展示该字符串在小端计算机的内存中是如何表示的。当然,这听起来像是一个棘手的问题,因为 ASCII 字符串不受字节序问题的影响。

但令人震惊的是,实习生声称他的教授坚持将字符串表示为:

P-yM azzi

我知道这是不对的。 ASCII 字符串在任何机器上都不可能像那样表示。但显然,教授坚持这一点。所以,我写了一个小的 C 程序,并告诉实习生把它交给他的教授。

#include <string.h>
#include <stdio.h>

int main()
{
    const char* s = "My-Pizza";
    size_t length = strlen(s);
    for (const char* it = s; it < s + length; ++it) {
        printf("%p : %c\n", it, *it);
    }
}

这清楚地表明该字符串在内存中存储为“My-Pizza”。一天后,实习生回到我身边,告诉我教授现在声称 C 正在自动转换地址以按正确顺序显示字符串。

我告诉他他的教授疯了,这显然是错误的。但只是为了检查我自己的理智,我决定将其发布到 stackoverflow 上,这样我就可以让其他人确认我在说什么。

所以,我问:谁在这里?

最佳答案

毫无疑问,你是对的。

ANSI C 标准 6.1.4 指定字符串文字通过“连接”文字中的字符存储在内存中。

ANSI 标准 6.3.6 还指定了加法对指针值的影响:

When an expression that has integral type is added to or subtracted from a pointer, the result has the type of the pointer operand. If the pointer operand points to an element of an array object, and the array is large enough, the result points to an element offset from the original element such that the difference of the subscripts of the resulting and original array elements equals the integral expression.

如果归因于此人的想法是正确的,那么当整数用作数组索引时,编译器也必须对整数数学进行处理。还会产生许多其他的谬误,留给想象。

这个人可能会感到困惑,因为(与字符串初始值设定项不同),多字节字符常量,例如“ABCD”是按字节顺序存储的。

一个人可能对此感到困惑的原因有很多。正如其他人在这里所建议的那样,他可能误读了他在调试器窗口中看到的内容,其中的内容已经过字节交换以提高 int 值的可读性。

关于c - ASCII 字符串和字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1568057/

相关文章:

c++ - 从文件中读取十六进制值

Python 'ascii' 编解码器无法使用 request.get 对字符进行编码

java - Android 中如何将 ASCII 字符转换为十进制数字?

c - 在 C 中交换字节顺序

c - c语言中的右移。

在单独的函数中创建新进程 [c]

c - 如何使用 flex/bison 解析 C 字符串 (char *)?

c++ - 如何使用 C++ 代码验证 CPU 缓存行大小?

javascript - 如何在javascript中将char转换为ascii

c++ - 如何从网络管理双字节序