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
值,并且上面假设您没有使用这样的实现,但这些是允许的有些可能存在。
我是编程语言的新手,我需要你的帮助。 我在这里研究某人的代码,我可以理解这些表达式,我的疑问是这里的操作是如何完成的,因为字符和整数是两种不同的数据类型? 整数类型如何保存字符值?
谢谢
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
值,并且上面假设您没有使用这样的实现,但这些是允许的有些可能存在。