我目前正在编写一个涉及处理字节的C程序。说到字节,我对以下问题感到困惑。
字符是否由ascii代码存储在内存中?说'A'有anscii代码65.所以它以与整数65相同的方式存储在内存中?
如果是这样,机器如何区分字符和整数?
如果字符由ascii代码存储,则ascii代码是整数。一个整数应占用至少2个字节,一个字符如何只占用1个字节?
最后一个是关于不同架构的整数。在16位机器上,如果1存储为000 ... 0001,那么在32位机器上,1仍然以相同的方式存储,只需在前面添加0?
答案 0 :(得分:10)
字符是否由ascii代码存储在内存中?说'A'有 anscii代码65.所以它以与整数65相同的方式存储在内存中?
是的,但C中的char
是单字节,而int
取决于机器架构。
如果是这样,机器如何区分字符和整数?
机器代码不关心内存中的字节代表什么。编译器的工作就是将代码转换为执行程序操作的机器指令。
如果字符由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?
这大多是正确的,但也取决于架构的endianness。
答案 1 :(得分:3)
是的,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。