【发布时间】:2021-08-15 08:52:08
【问题描述】:
int x =5;
char y = x + '0';
显然,这段代码将整数转换为字符串。但我不明白它在幕后是如何运作的。我是新手。有人能解释一下如何用 int 添加字符串 0 将其转换为字符串吗?
【问题讨论】:
标签: c string type-conversion
int x =5;
char y = x + '0';
显然,这段代码将整数转换为字符串。但我不明白它在幕后是如何运作的。我是新手。有人能解释一下如何用 int 添加字符串 0 将其转换为字符串吗?
【问题讨论】:
标签: c string type-conversion
在
char y = x + '0';
输入'0' 的字符代码(ASCII 或您的系统实现的任何字符代码)并将5 添加到其中,然后再次将该整数转换为ASCII(/UTF-8 或任何其他字符编码) 字符,这就是您的输出 (5)。
幕后发生的事情是这样的:
y = 5 + 48 ;for ASCII/UTF-8 character code of '0' is 48
y = 53
53 的 ASCII/UTF-8 字符是 '5'。
它不会将字符串转换为整数。它只是给你等效的字符。
我们可以将int(0-127) 转换为char,反之亦然,输出将是一个ASCII/UTF-8 值。 char 在内存中存储为short int。即它们是8-bit int 值。
【讨论】:
你这里有点误会。变量y 不是字符串,它是一个字符。 string 是一个字符数组。你实际上在这里做的是:
char y = x + 48; //48 is the ASCII encoding of 0
这有点像:
char y = 50;
printf("%c\n", y); //prints 2 as a char
这是因为字符是用特定值编码的。例如。 'a' 是 97。'b' 是 98,依此类推。同理 '0' 的代码是 48。
char y = x + '0'
意思是将0(即48)的编码值加到x上。因为0 是第一个数字,所以另一个数字的代码就在它旁边。这就是我的意思:
48 -> This is 0
49 -> This is 1
50 -> This is 2
51 -> This is 3
52 -> This is 4
53... and so on
您可能会注意到,为了获得例如。 1、我们需要加一到零。 48 + 1 = 49 和 49 是 1 的编码。这适用于所有数字。
注意:我使用 ASCII 编码进行解释,但还有其他编码,它应该适用于大多数奇怪的编码。
【讨论】:
'0' 在符合 C 标准的所有 C 实现中都有效,因为标准要求数字的字符代码是连续的。
'0' 是一个 int,而不是一个字符串。字符串文字有双引号(例如"Hi!")。字符文字(整数)有单引号(例如'A')。
x + '0' 的计算结果为 int,因为两个操作数都是 int。
字符文字的整数值是它的 ASCII 值:https://en.wikipedia.org/wiki/ASCII#Character_set
从ascii表中,'0'的整数值为48。
现在来看问题中的表达方式:
x 是 5,“0”是 48。
因此 y = 48+5(即 53)。
当您使用printf("%c", y) 将y 打印为字符时,将打印ASCII 值为53 的字符。即'5'
为什么将'0'添加到单个数字整数似乎将其转换为整数是因为'0'到'9'在ASCII表中是一个接一个。这意味着'9' (57) 在'0' (48) 之后正好是 9 个空格。
这就是为什么将两位整数添加到“0”不起作用的原因。例如。 '0' + 10 将是 ':'(ASCII 值 58)。
要将较大的字符串正确转换为整数,请使用 atoi 函数 (https://man7.org/linux/man-pages/man3/atoi.3.html)。 例如
int a = atoi("1023"); // a is an integer with the value 1023
【讨论】:
That means it can take values from -128 to 127 这是完全错误的。 char can be signed or unsigned 可以包含超过 8 位的数据。所以char 可以包含 [0, 2^CHAR_BIT] 范围内的值,如果它是无符号的,并且 [-2^(CHAR_BIT/2), 2^(CHAR_BIT/2) - 1] 如果它是有符号的
'0' 是一个字符 Actually it's an integer: "一个整数字符常量的类型为int. ..."
char 是默认签名的并且正好占用8 位(因为uint8_t typedefs 到unsigned char。不知道甚至 that 是特定于实现的)。也不知道'0' 是int。 (为什么会这样?使用char 不是更有效吗?)无论如何,我正在更新答案以解决这些问题。如果它仍然没有提供价值,请告诉我。我会删除它。
uintN_t 是可选类型,uint8_t 仅在 CHAR_BIT == 8 时存在。仅需要 (u)int_fastN_t 和 (u)int_leastN_t。我不知道为什么字符 C 决定字符文字应该是 int,但可能是因为像 'abcd' 这样的多字符文字通常用于像 FourCC 这样的签名,并且因为整数提升。但在 C++ 中,'0' 是 char:Why are C character literals ints instead of chars?