4

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

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

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

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

编辑:相关:C比较char和int

4

4 回答 4

6

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

C 标准保证 '0' 到 '9' 是连续的,因此您可以递增一个数字字符('9' 除外)并获取下一个数字字符,或者对它们进行其他算术运算 (C 1999 5.2.1 3)。

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

于 2012-12-11T19:51:53.933 回答
4

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

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

char ch = 'A';

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

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

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

它是否完全取决于特定的环境?

是的,差不多。

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

不,您只需要小心并非常了解标准 - 这样您就安全了。

于 2012-12-11T19:45:27.960 回答
2

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

于 2012-12-11T19:47:37.397 回答
1

在源代码有'A'的地方,编译后的对象只会有字节值。这就是为什么允许对字节进行算术运算(is 的类型'A'char即字节)。

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

松散地,您可以将charC 源代码中的字符串文字视为本质上的宏。在 ASCII 系统上,“宏”'A'将解析为(char) 65,在 EBCDIC 系统上解析为(char) 193. char类似地,C 字符串编译成以s(字节)的零结尾数组。这个逻辑也影响符号表,因为符号是从源代码中获取的。

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

于 2012-12-11T20:39:08.027 回答