关于C#:内存中如何存储不同类型的数据

How are different types stored in memory

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

  • 字符是否按其ASCII码存储在内存中? 假设" A"具有anscii代码65。那么它以与整数65相同的方式存储在内存中吗?

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

  • 如果字符由ASCII码存储,则ASCII码是整数。 一个整数应该至少占据2个字节,一个字符怎么只占据1个字节?

  • 最后一个是关于不同体系结构上的整数的。 在16位计算机上,如果将1存储为000 ... 0001,那么在32位计算机上,是否仍以相同的方式存储1,只是在前面加0?


  • Are characters stored in memory by their ascii codes? Say 'A' has
    anscii code 65. So it's stored in memory the same way as integer 65?

    是的,但是C中的char是一个字节,而int取决于计算机体系结构。

    If so, how does the machine distinguish a character and an integer?

    机器代码不在乎内存中的字节代表什么。编译器的工作是将您的代码转换成可以执行程序操作的机器指令。

    If characters are stored by ascii codes, an ascii code is an integer.
    An integer should occupy at least 2 bytes, how come a character only
    occupy 1 byte?

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

    The last one is about integers on different architectures. On a 16-bit
    machine, if 1 is stored as 000...0001, then on a 32-bit machine, is 1
    still stored the same way just adding 0 at the front?

    这在大多数情况下是正确的,但也取决于体系结构的字节序。


  • 是的,ASCII字符按其值存储。但是存储" A"(65 = 0x41)可能与存储65本身不同,并且存储方式如何取决于您的计算机体系结构。一个char可以存储一个字节,而int至少要存储2个字节(在现代机器中通常为4个字节),因此它们的存储方式可能不同。

  • 没有。我们可以拥有等于0x41的内存。区分" A"和65的唯一方法是基于对编译器的声明方式。换句话说,如果将变量声明为int,则将其视为int。

  • ASCII值太少,以至于您可以用少于8位表示所有可能性。因此,使用16位来表示这将浪费内存。在当今的系统中,这不再是一个大问题,但是在内存受限的系统上,您可能希望将多余的字节用于其他目的,而不是浪费空间。

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