字符与ASCII码的关系

4
在C编程语言中,char是一个固定大小的字节实体,专门设计用于存储来自诸如ASCII之类的编码的字符值。
但是,与ASCII编码相关的整数值在多大程度上可以与char字符交换?是否有办法将'A'表示为65(十进制)?
getchar()返回一个整数-这可能直接关系到这些值。此外,如果我没有弄错,在某些情况下可以增加字符…例如(粗略地说)'?' + 1 = '@'。
或者,这种编码不保证是ASCII吗?它完全取决于特定的环境吗?在C中,这样处理char是不切实际或不可能的吗?
编辑:相关:C comparison char and int
4个回答

6
我只回答关于增加字符的问题,因为其他问题在其他答案中已经得到解决。
C标准保证'0'到'9'是连续的,所以你可以增加一个数字字符(除了'9'),并获得下一个数字字符,或者对它们进行其他算术运算(C 1999 5.2.1 3)。
其他字符之间的关系在C标准中没有保证,所以您需要从特定的C实现(主要是编译器)获取文档。

@Esailija,所以[真相]对你来说没有意义,因为[虚假]??Eric引用了C标准的章节,提供了这个保证...如果你怀疑,请去阅读它。 - Jim Balter
5
“@Esailija 'how can they guarantee that when they don't guarantee the encoding.' -- By doing so. Your question makes no sense and shows a fundamental failure to understand logic and sets. "why cannot they guarantee 'A'-'Z'? " -- They CAN, but they DON'T, because EBCDIC violates it.”-- 通过这样做。你的问题毫无意义,表明你在逻辑和集合方面存在根本性的理解失败。“为什么不能保证'A'-'Z'?”-- 他们可以,但是他们不保证,因为EBCDIC违反了它。 - Jim Balter
@JimBalter 哦,我明白了,没想到有一种编码,其中a-z不是连续的。这回答了我的问题,谢谢。 - Esailija
2
@Esailija 对的。语言标准已经成为语言发明的问题,但是C标准在很大程度上实际上规范化了当时已经存在的实践。由于ASCII和EBCDIC都在使用中,标准委员会提供了它们可以满足的保证。 - Jim Balter
当然,人们可以问,什么样的白痴会发明一种字符编码,其中a-z不是连续的,但我们必须回到穿孔卡的历史。 - Jim Balter
显示剩余2条评论

4
但是,ASCII编码相关的整数值和字符变量到什么程度上可互换?是否有办法将 'A' 表示为 65(十进制)?
实际上,你无法做其他事情。char 只是一种整数类型,如果你写:
char ch = 'A';

假设(采用ASCII编码),ch将仅保存整数值65,将其呈现给用户是一个不同的问题。

或者说这样的编码不能保证是ASCII吗?

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

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

是的,基本上是这样。

在C中进行这样的字符操作是不切实际或不可能的吗?

不是的,你只需要小心并且了解标准,那么就会很安全。


2

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


1

在源代码中,如果有'A',则编译的对象只会有字节值。这就是为什么可以对字节进行算术运算('A'的类型是char,即字节)。

当然,必须应用字符编码(更准确地说是代码页)才能得到该字节值,而该代码页将用作编译器的“本地”编码,用于硬编码字符串和char值。

松散地说,您可以将C源代码中的char和字符串文字基本上视为宏定义。在ASCII系统上,“宏” 'A' 将解析为(char) 65,而在EBCDIC系统上,则解析为(char) 193。同样,C字符串编译为char(字节)的零终止数组。此逻辑还影响符号表,因为符号是从其本地编码的源中提取的。

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


UTF-16不会被排除,因为ISO C保证的所有字符都可以用一个(16位)字节来表示。 - Remember Monica
是的,一个16位字节。字节不仅限于8位,您可能将其与八位字节混淆了。 - Remember Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接