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

时间:2014-02-11 05:14:58

标签: c memory types

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

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

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

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

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

2 个答案:

答案 0 :(得分:10)

  

字符是否由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

答案 1 :(得分:3)

  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。