C 中的字符和整数运算

Operations with Characters and Integers in C

我是编程语言的新手,我需要你的帮助。 我在这里研究某人的代码,我可以理解这些表达式,我的疑问是这里的操作是如何完成的,因为字符和整数是两种不同的数据类型? 整数类型如何保存字符值?

谢谢

int line, col;
char ch;
scanf("%d%c", &line, &ch);
//line--;
col = ch - 'A';

在基本层面上,C 中的每个类型(无论是 char、int、uint32_t、short、long...)都由字节表示,并且在形式上是 'numerical'。您可以将它们彼此相减/以您喜欢的任何组合将它们相加 - 只要您将结果值存储在类型足以容纳它的变量中 - 否则会导致缓冲区溢出。

在您的示例中,由于 char 类型由单个字节表示,而 int 由 8 组成,因此此减法的结果将简单地存储在 int 的 right-most 字节中(但是,这取决于您处理的表达式是否会产生负值,然后 int 在内存中的表示会略有不同 - 如果您感兴趣,请查看 2 的补码)。

当你将两个字符相减,并把它们放在一个整数类型的变量中时,实际上是将这两个字符的ASCII码相减。 例如当你有:

int col = 'D' - 'A';

col的值等于3 因为D的ascii码等于68,A的ascii码是65,所以col是3,而D&A是字符。 你也可以see here

my doubt is how is the operation done here, given that a character and an integers are two different data types?

考虑到这个问题是关于语言的一些相当基本的行为,我不确定这里会收到多好的问题,但是我赞扬你考虑类型和类型匹配.继续这样做!

首先要明白的是,在C中,char及其有符号和无符号变体都属于整数数据类型,所以不存在类型类别不匹配的问题,只是[=72=的问题] 范围和签名。字符由整数代码表示(事实上,计算机内存中的几乎所有内容)。

第二点要理解的是,C 支持对混合类型的操作数进行各种算术运算。它定义了一组“常用算术转换”,用于为操作数和每个算术运算的结果选择通用类型。操作数会自动转换为该类型。我不会在这里涵盖所有细节,但基本上,floating-point 类型胜过整数类型,更宽的类型胜过更窄的类型。

第三点要理解的是,C 在任何情况下都不会直接在比 int 窄的整数类型上定义算术(从技术上讲,整数转换等级小于 int。当算术表达式中出现更窄的值时,它会自动转换为 int(如果 int 可以表示原始类型的所有值)或 unsigned int。这些自动转换称为“整数提升”,它们是常用算术转换的子集。

第四件有时需要知道的重要事情是,在 C 语言中“整数字符常量”,例如 'A' 的类型为 int,而不是类型char(C++ 在这里不同)。

所以,要评估这个...

col = ch - 'A';

...通常的算术转换首先应用于 ch'A'。这涉及对 ch 的值执行整数提升,得到相同的数值,但作为 int。常量 'A' 已经具有类型 int,因此它们现在匹配,并且可以计算它们的差异而无需任何进一步的转换。结果是 int,与 col 类型相同,因此也不需要转换来分配结果。

How will the integer type hold the character value?

字符值整数值。类型 int 可以容纳类型 char 可以容纳的所有值。* 在这方面没有发生什么特别的事情。


*技术上,int可以容纳所有可以用signed char表示的值,unsigned int可以容纳所有可以用signed char表示的值由类型 unsigned char 表示,两者中至少有一个可以容纳所有可以由(默认)char 表示的值。您不太可能 运行 跨 C 实现,其中存在 int 无法容纳的 char 值,并且上面假设您没有使用这样的实现,但这些是允许的有些可能存在。