如何将不同类型存储在内存中

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

  1. 字符是否由ascii代码存储在内存中? 说’A’有anscii代码65.所以它以与整数65相同的方式存储在内存中?

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

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

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

字符是否由ascii代码存储在内存中? 说’A’有anscii代码65.所以它以与整数65相同的方式存储在内存中?

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

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

机器代码不关心内存中的字节代表什么。 编译器的工作是将代码转换为执行程序function的机器指令。

如果字符由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?

这大多是正确的,但它也取决于架构的字节顺序 。

  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。