【问题标题】:How are different types stored in memory不同类型如何存储在内存中
【发布时间】:2014-03-08 18:10:01
【问题描述】:

我目前正在编写一个涉及处理字节的 C 程序。说到字节,我真的很困惑以下问题。

  1. 字符是否通过其 ascii 代码存储在内存中?假设“A”的 anscii 代码为 65。所以它在内存中的存储方式与整数 65 相同?

  2. 如果是,机器如何区分字符和整数?

  3. 如果字符由 ascii 代码存储,则 ascii 代码是一个整数。一个整数至少要占2个字节,怎么一个字符只占1个字节?

  4. 最后一个是关于不同架构上的整数。在 16 位机器上,如果 1 存储为 000...0001,那么在 32 位机器上,1 是否仍以前面加 0 的方式存储 1?

【问题讨论】:

  • 机器区分不同的类型。 C++ 编译器可以。
  • @ValekHalfHeart 编译器是否通过声明类型来区分?
  • 是的,这就是声明类型的用途。
  • 有关字符编码(UTF-8、UTF-16、UCS-2 等)的讨论,请参阅stackoverflow.com/questions/11107608/…

标签: c memory types


【解决方案1】:

字符是否通过它们的 ascii 代码存储在内存中?说'A'有 anscii 代码 65。所以它在内存中的存储方式与整数 65 相同?

是的,但是 C 中的 char 是一个字节,而 int 取决于机器架构。

如果是,机器如何区分字符和整数?

机器代码不关心内存中的字节代表什么。编译器的工作是把你的代码翻译成机器指令来执行你的程序。

如果字符是用 ascii 码存储的,那么 ascii 码就是一个整数。 一个整数至少要占2个字节,怎么只有一个字符 占用1个字节?

ASCII 可以容纳在单个字节中(这是char 的大小)。在 C 中处理非 ASCII 文本更为复杂。wchar_t 是不可移植的,许多人认为它已损坏。 C11 引入了char16_tchar32_t,可以分别用于UTF-16 和UTF-32。

最后一个是关于不同架构上的整数。在 16 位 机器,如果 1 存储为 000...0001,那么在 32 位机器上,是 1 还是一样的存储方式只是在前面加0?

这大部分是正确的,但也取决于架构的endianness

【讨论】:

  • 措辞比我写的要好。
  • 那么当存储'A'和65时,不同的是之前65的0被丢弃在'A'中?
  • char a = 'A'char a = 65 之间绝对没有区别。如果你问的是int a = 65,那么是的,它有额外的 0。
  • @imgx64:char a = 'A'char a = 65 之间存在差异。前者将a初始化为执行字符集中的“A”值,可能是也可能不是ASCII。后者将a初始化为65。如果使用ASCII,它们是一样的,但是有C实现不使用ASCII。
  • @imgx64 我尝试打印出 sizeof('A'),它给了我 4;但是sizeof(char)确实是1。是不是因为'A'默认存储为C中的int?
【解决方案2】:
  1. 是的,ASCII 字符按其值存储。但是存储 'A' (65 = 0x41) 可能与存储 65 本身不同,如何完成取决于您的机器架构。 char 可以用单个字节存储,而 int 至少有 2 个字节(在现代机器中更常见的是 4 个字节),因此它们的存储方式可能不同。

  2. 没有。我们可以拥有等于 0x41 的内存。区分“A”和 65 的唯一方法是基于您向编译器声明它的方式。换句话说,如果您将变量声明为 int,它将被视为 int。

  3. ASCII 值非常少,以至于您能够用少于 8 位来表示所有可能性。因此,使用 16 位来表示这将浪费内存。在今天的系统中,这不再是一个大问题,但在内存有限的系统上,您可能希望将额外的字节用于其他内容,而不是浪费空间。

  4. 或多或少,是的。 1 将始终存储为 0000....1,因此二进制数字的总数等于填充 int 的空间。因此,在 8 位系统上,00000000 和 00000001 在两个字上,在 16 位系统上,000000000000001 在一个字上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多