我正在阅读 C 编程教科书1,在 1.6 中他们说包含数字的 char 和 int 之间的转换可以像这样完成:
char character = '7';
int integerChar = character - '0';
我无法理解这里发生的事情以及为什么整数值等于字符减去字符
'0'
.
1 布赖恩·W·克尼汉和丹尼斯·M·里奇 C 编程语言,第 2 版 1988.
来自C标准(5.2.1字符集)
- ...在源代码和执行基本字符集中,的值 上述十进制数字列表中 0 之后的每个字符应为 一个大于前一个.
的值
所以这意味着标准保证例如差值
'1' - '0'
等于1
,或者差值'2' - '0'
等于2
等等。
因此独立于字符的内部表示,例如 ASCII 或 EBCDIC,您可以获得由字符
c
表示的整数数字,如 c - '0'
.
例如在 ASCII 字符表中,字符
'0'
到 '9'
的代码从 48
到 57
。在 EBCDIC 字符表中,它们的代码从 240
到 249
.
这里有一个演示程序。
#include <stdio.h>
int main( void )
{
for (char c = '0'; c <= '9'; c++)
{
printf( "'%c': %d\n", c, c - '0' );
}
}
程序输出为
'0': 0
'1': 1
'2': 2
'3': 3
'4': 4
'5': 5
'6': 6
'7': 7
'8': 8
'9': 9
在符号表(比如经典的ASCII)中,C保证从
'0'
到'9'
的符号值被放置在一个连续的序列中。在实践中它可能看起来像:
48 '0'
49 '1'
50 '2'
...
因此,当您减去
'7'
- '0'
时,它与 55 - 48 = 7
完全相同。只有现在你有一个真正的整数值而不是符号表值。
举例说明:
#include <stdio.h>
int main(void)
{
char a = '0';
char b = '7';
printf("'%c' is %d\n", a, a);
printf("'%c' is %d\n", b, b);
printf("%d - %d = %d\n", b, a, b-a);
}
输出:
'0' is 48
'7' is 55
55 - 48 = 7
你需要做
- '0'
操作当且仅当你需要使用char
作为int
例子:
char c = '7';
int a = c;
如果打印整数及其整数值,
printf("%d", a);
你会得到
55
。那是因为int
在内存中的值在内存中包含'7'
,它的int值在ASCII表中将是55
。
如果您使用 char 打印整数,它会获取 char 值并为您提供
7
printf("%c", a);
请注意,虽然打印格式必须合适,例如您不能在 int 上打印浮点值
%f
,因为打印时浮点值需要 double
,因为需要更多内存。 (Double 是 8 个字节,因此 int 和 char 是 4 个字节值)
如果字符是数字,则操作
char - char
的结果将是整数。所以在0
到9
的范围内。
所以如果你要打印
printf("%d", '9' - '2');
这会给你
7
作为一个整数而不是字符,因为该方程的结果导致 int
.
因此,从 char 中减去基本
'0'
char 是获得整数值作为回报的简单方法,而 char 以其原始形式被减去。
因为 ASCII 是那样做的。
前4bits为0011,后4bits代表数字的值
Ex) '3' = 0011 + 0011
'9' = 0011 + 1001