Char - ASCII关系

时间:2012-12-11 19:34:25

标签: c character-encoding char ascii

C编程语言中的char是一个固定大小的字节实体,专门设计为足以存储ASCII等编码的字符值。

但是与ASCII编码相关的整数值在多大程度上可以与char字符互换?有没有办法将'A'称为65(十进制)?

getchar()返回一个整数 - 大概这与这些值直接相关?另外,如果我没有弄错,在某些情况下可能会增加字符......这样(粗略地说)'?'+ 1 =='@'。

或者这种编码不能保证是ASCII吗?它完全取决于特定的环境吗? C中的这种操作是否不切实际或不可能?

修改:相关:C comparison char and int

4 个答案:

答案 0 :(得分:5)

我正在回答关于增加字符的问题,因为其他问题在其他答案中得到解决。

C标准保证'0'到'9'是连续的,所以你可以增加一个数字字符('9'除外)并得到下一个数字字符,或用它们做其他算术(C 1999 5.2.1) 3)。

C标准不保证其他字符之间的关系,因此您需要来自特定C实现(主要是编译器)的文档。

答案 1 :(得分:4)

  

但是与ASCII编码相关的整数值在多大程度上可以与char字符互换?有没有办法将'A'称为65(十进制)?

事实上,你不能做任何其他事情。 char只是一个完整的类型,如果你写

char ch = 'A';

然后(假设是ASCII),ch只会保存整数值65 - 将它呈现给用户是一个不同的问题。

  

或者这种编码不能保证是ASCII吗?

不,不是。 C不依赖于任何特定的字符编码。

  

它完全取决于特定环境吗?

是的,差不多。

  

这种对字符的操纵在C中是不切实际还是不可能?

不,你只需要小心并且非常了解标准 - 然后你就会安全。

答案 2 :(得分:2)

如果源代码具有'A',则编译对象将只具有字节值。这就是为什么它允许用字节算术('A'的类型是char,即字节)。

当然,必须应用字符编码(更准确地说,代码页)来获取该字节值,并且该代码页将用作硬编码字符串和{{1}的编译器的“本机”编码。 }值。

很容易,您可以将C源中的char和字符串文字视为基本上是宏。在ASCII系统上,“宏”char将解析为'A',而在EBCDIC系统上将解析为(char) 65。类似地,C字符串编译为以(char) 193 s(字节)为零的终止数组。此逻辑也会影响符号表,因为符号是以其本机编码从源中获取的。

所以不,ASCII不是源代码中文字编码的唯一可能性。但由于单引号字符的限制为char s,因此可以保证排除UTF-16或其他多字节编码。

答案 3 :(得分:1)

像'A'这样的字符文字具有类型int ..它们可以与它们的整数值完全互换。但是,C标准没有规定该整数值;它可能是ASCII(并且适用于绝大多数常见实现)但不一定是;它是实现定义的。字符的整数值的映射确实具有标准给出的一个保证:十进制数字的值是连续的。 (即'1' - '0'== 1,......'9' - '0'== 9)。