小尾数和覆盖内存位置

Som*_*ion 2 c memory endianness undefined-behavior

首先我\xe2\x80\x99ll明确表示我知道这段代码是UB。我仍然不确定这是如何运作的。

\n
#include <stdio.h>\n\nint x[] = {1, 2, 3};\nchar s[] = "hello";\n\nint main()\n{\n    puts(s);\n    x[3] = (\'e\' << 16) + (\'y\' << 8) + \'b\';\n    puts(s);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

所以这会打印你好和再见。当然是 UB,但我想知道这里发生了什么。\n我以为我理解小端和大端是如何工作的,但显然 \xe2\x80\x99 不是这样,因为我\xe2\x80\x99一直在查看这已经过去 30 分钟了,但仍然不明白 xe2x80x99 发生了什么。

\n

如果可能的话,我真的很感激图表\xe2\x80\xa6

\n

我的理解:

\n
    \n
  • \xe2\x80\x98x\xe2\x80\x99 和 \xe2\x80\x98s\xe2\x80\x99 与此输出一起在内存中按顺序排列。
  • \n
  • 覆盖 x[3] 会覆盖 s。
  • \n
\n

我不\xe2\x80\x99t 得到:

\n
    \n
  • 如何以及为什么打印 \xe2\x80\x98bye\xe2\x80\x99 。记忆发生了什么。让\xe2\x80\x99s 假设\xe2\x80\x99s 不是UB\xe2\x80\xa6
  • \n
  • 如何以及为何在 \xe2\x80\x98bye\xe2\x80\x99 中的 \xe2\x80\x98e\xe2\x80\x99 之后插入空终止符。
  • \n
  • 字节序与这一切有什么关系。
  • \n
\n

谢谢。

\n

dbu*_*ush 5

这个表达式:

('e' << 16) + ('y' << 8) + 'b'
Run Code Online (Sandbox Code Playgroud)

其类型的int十六进制值(假设为 ASCII)为0x00657962。然后,您可以使用类型为 的左值来存储它int。假设int是32位,小端字节序,则将上面的字节反转表示,即0x62 0x79 0x65 0x00。当这些字节被解释为字符串时,字符bye后跟一个空终止字节,这反映了打印的内容。