在 C 语言中将数字从字符转换为整数

问题描述 投票:0回答:5

我正在阅读 C 编程教科书1,在 1.6 中他们说包含数字的 char 和 int 之间的转换可以像这样完成:

char character = '7';
int integerChar = character - '0';

我无法理解这里发生的事情以及为什么整数值等于字符减去字符

'0'
.


1 布赖恩·W·克尼汉和丹尼斯·M·里奇 C 编程语言,第 2 版 1988.

c type-conversion char digits
5个回答
5
投票

来自C标准(5.2.1字符集)

  1. ...在源代码和执行基本字符集中,的值 上述十进制数字列表中 0 之后的每个字符应为 一个大于前一个.
  2. 的值

所以这意味着标准保证例如差值

'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

3
投票

在符号表(比如经典的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
投票

在c语言中变量是作为ASCII值存储在内存中的。 ASCII 值范围从 0 到 255,以十进制表示。
看这个 👉 ascii table .
所以 '0' = 48 & '7' = 55, 因此,如果我们从 ('7')55 中减去 ('0')48,我们将得到 int 值 7。
此代码适用于任何数字字符。
例如,如果字符为 '3',则字符 - '0 ' 将评估 51 - 48 = 3.


0
投票

你需要做

- '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 以其原始形式被减去。


-3
投票

因为 ASCII 是那样做的。

前4bits为0011,后4bits代表数字的值

Ex) '3' = 0011 + 0011

'9' = 0011 + 1001

© www.soinside.com 2019 - 2024. All rights reserved.