为什么将'0'添加到整数数字可以转换为字符?
Why does adding a '0' to an int digit allow conversion to a char?
我在很多地方都看到过这样的例子:
int i = 2;
char c = i + '0';
string s;
s += char(i + '0');
但是,我还没有看到为什么添加零允许转换的解释
如果您查看ASCII表asciitable,您将看到数字从48(表示'0')开始,一直到57(表示'9')。因此,为了获得数字的字符代码,您可以将该数字添加到'0'的字符代码中。
当使用ASCII编码时,'0'
的整数值为48
。
'0' + 1 = 49 = '1'
'0' + 2 = 50 = '2'
...
'0' + 9 = 57 = '9'
所以,如果你想把一个数字转换成它对应的字符,只需要加上'0'
。
即使平台使用非ascii编码,语言仍然保证字符'0'
- '9'
必须编码为:
'1' - '0' = 1
'2' - '0' = 2
'3' - '0' = 3
'4' - '0' = 4
'5' - '0' = 5
'6' - '0' = 6
'7' - '0' = 7
'8' - '0' = 8
'9' - '0' = 9
当使用ASCII编码时,它变成:
'1' - '0' = 49 - 48 = 1
'2' - '0' = 50 - 48 = 2
'3' - '0' = 51 - 48 = 3
'4' - '0' = 52 - 48 = 4
'5' - '0' = 53 - 48 = 5
'6' - '0' = 54 - 48 = 6
'7' - '0' = 55 - 48 = 7
'8' - '0' = 56 - 48 = 8
'9' - '0' = 57 - 48 = 9
因此,无论平台使用何种字符编码,
int i = 2;
char c = i + '0';
将始终导致c
的值等于字符'2'
。
c++标准在其[lex]中规定:(引用自N4659草案)
因此,'1'
的值为' 0'+1
', '2'
的值比它大1,即'0'+2
,以此类推。如果n
的值为0 ~ 9,则'0'+n
为'0'
~ '9'
对应字符的值。
(与前面的答案不同,这个答案不假设ASCII,并显示属性如何从c++标准派生。)
基于ASCII值。加上ASCII值0(即48)意味着48 + 5将等于53或ASCII 53(即5)。
谷歌ASCII,找到一个好的图表,并研究它。当您查看每个字符(字符)的值时,应该可以理解。
(char)(i+c)
,其中c
是char
,给您一个新的char
,其ascii值等于(c
的ascii值)+ i
。由于数字0-9的ascii值是连续的,只要i
在适当的范围内,i+'0'
就会给出与i
对应的字符。
EDIT: (i+c)
是int型,正如Jarod42指出的那样。增加了强制转换以保持正确性。
char将根据ASCII值将整数转换为相应的值,因此如果您将值48赋给char,它将存储0,因为48是ASCII值0。相应地,将ASCII值0添加到需要转换为char
- HEX值到wchar_t字符(UTF-8)的转换
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 转换特殊字符(UTF-8)
- 将转换字符键入 int 以用作向量C++的索引
- 将字符随机转换为大写的函数
- 尝试将字符串/字符转换为整数会产生意外结果
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 转换字符时Arduino DUE 和 Arduino UNO 之间的区别
- 如何在C++中正确重载运算符转换字符*?
- 如何转换数据结构以在 c++ 中转换字符*
- 不兼容的转换字符
- 将转换字符数组[16]键入为int 128位
- 在c++中转换字符编码
- 使用递归转换字符
- 如何在Objective-C/C/C++中转换字符和字节的位置
- C++到Pep/8汇编语言的转换——字符数组
- 转换字符>十六进制