繁体   English   中英

C 中的字符和整数运算

[英]Operations with Characters and Integers in C

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

谢谢

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

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

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

当你将两个字符相减并放入一个integer类型的变量中时,实际上是两个字符的ASCII码相减。 例如当你有: int col = 'D' - 'A' col 的值等于 3 因为 D 的 ascii 码等于 68 而 A 的 ascii 码是 65. 所以 col 是 3,但是 D & A是性格。

我的疑问是这里的操作是如何完成的,因为字符和整数是两种不同的数据类型?

我不确定这个问题在这里的接受程度如何,因为它是关于语言的一些相当基本的行为,但我建议你考虑类型和类型匹配 继续这样做!

首先要了解的是,在 C 中, char及其有符号和无符号变体属于 integer 数据类型,因此不存在类型类别不匹配,只是可能不同的范围和符号的问题。 字符由 integer 代码表示(事实上,几乎是计算机内存中的所有内容)。

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

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

有时需要知道的第四件事是,在 C 中,“ integer 字符常量”例如'A'具有int类型,而不是char类型(C++ 在此处有所不同)。

所以,要评价这个...

 col = ch - 'A';

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

integer 类型将如何保存字符值?

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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM