C编程语言中的char是一个固定大小的字节实体,专门设计为足以存储ASCII等编码的字符值。
但是与ASCII编码相关的整数值在多大程度上可以与char字符互换?有没有办法将'A'称为65(十进制)?
getchar()返回一个整数 - 大概这与这些值直接相关?另外,如果我没有弄错,在某些情况下可能会增加字符......这样(粗略地说)'?'+ 1 =='@'。
或者这种编码不能保证是ASCII吗?它完全取决于特定的环境吗? C中的这种操作是否不切实际或不可能?
答案 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)。