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}\nRun Code Online (Sandbox Code Playgroud)\n所以这会打印你好和再见。当然是 UB,但我想知道这里发生了什么。\n我以为我理解小端和大端是如何工作的,但显然 \xe2\x80\x99 不是这样,因为我\xe2\x80\x99一直在查看这已经过去 30 分钟了,但仍然不明白 xe2x80x99 发生了什么。
\n如果可能的话,我真的很感激图表\xe2\x80\xa6
\n我的理解:
\n我不\xe2\x80\x99t 得到:
\n谢谢。
\n这个表达式:
('e' << 16) + ('y' << 8) + 'b'
Run Code Online (Sandbox Code Playgroud)
其类型的int十六进制值(假设为 ASCII)为0x00657962。然后,您可以使用类型为 的左值来存储它int。假设int是32位,小端字节序,则将上面的字节反转表示,即0x62 0x79 0x65 0x00。当这些字节被解释为字符串时,字符bye后跟一个空终止字节,这反映了打印的内容。