如何将不同类型存储在内存中
我目前正在编写一个涉及处理字节的C程序。 说到字节,我真的很担心以下问题。
-
字符是否由ascii代码存储在内存中? 说’A’有anscii代码65.所以它以与整数65相同的方式存储在内存中?
-
如果是这样,机器如何区分字符和整数?
-
如果字符由ascii代码存储,则ascii代码是整数。 一个整数应占用至少2个字节,一个字符怎么只占用1个字节?
-
最后一个是关于不同体系结构的整数。 在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_t
和char32_t
,它们分别可用于UTF-16和UTF-32。
最后一个是关于不同体系结构的整数。 在16位机器上,如果1存储为000 … 0001,那么在32位机器上,1仍然以相同的方式存储,只需在前面添加0?
这大多是正确的,但它也取决于架构的字节顺序 。
-
是的,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。