【问题标题】:Memory representation string in Little Endian and Big EndianLittle Endian 和 Big Endian 中的内存表示字符串
【发布时间】:2019-03-13 04:15:19
【问题描述】:
char S[6] = "18243";

以下字符串在大端和小端系统中如何表示?

【问题讨论】:

  • Endianness 与数组无关,数组总是按相同的顺序存储(第一个元素在前,最后一个元素在后,地址递增)。

标签: c memory endianness cpu-architecture


【解决方案1】:

char 类型包含一个字节。因此,该类型不涉及字节序。

在您的示例中,您有一个数组。数组元素一个接一个地存储在内存中。所以S[0]先出现,然后S[1]等:

  -----------------------------------
S | '1' | '8' | '2' | '4' | '3' | 0 |
  -----------------------------------

【讨论】:

  • char 大于 8 位时是否仍然没有字节序?
  • @FiddlingBits 正确。当涉及到类型的字节序时,一个字节中的位数无关紧要。
  • char 在具有字可寻址内存的 DSP 上可以是 32 位,通常称为 4 字节,不称为大字节。无法单独访问每个字的字节(使用 DMA 或使用 MMIO 加载/存储除外),因此 char 中的字节顺序除了外部硬件之外仍然没有意义。 (ping @FiddlingBits,这与您的问题有关。)
  • @FiddlingBits 虽然 C 规范允许 char 类型的不同位宽,但它仍然是任何目标平台上最小的可寻址单元,因此单个 char 不存在字节顺序问题。
【解决方案2】:

字节序仅适用于数字(大于一个字节)。

无论字节顺序如何,字符串都以相同的方式表示:最低有效地址的第一个字母。

【讨论】:

  • 人们可能会询问其他编码,如 JIS、UTF-16、UTF-32 或其他宽字符类型。我相信 C 支持宽字符 (wchar_t)。
【解决方案3】:

假设 compiler/linker/loader 决定将 S 放在地址 0x420000。

0x420000 '1'
0x420001 '8'
0x420002 '2'
0x420003 '4'
0x420004 '3'
0x420005 '\0'

【讨论】:

  • 为什么要删除编译器和链接器?
  • @FiddlingBits 它模仿了我的思维过程,我认为普通的“加载器”不会提供丰富的信息。
  • 只是想了解它是否相关。
  • @FiddlingBits 无关紧要,但信息丰富 :) 就像选择 '\0'0 是绝对相等的,所以选择无关紧要
猜你喜欢
  • 2019-06-30
  • 2018-05-15
  • 2020-12-01
  • 2012-10-09
  • 2010-10-16
  • 2022-06-10
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多