在 C++ 中获取字符的 ASCII 时出错
Error in getting ASCII of character in C++
我看到了这个问题:How to convert an ASCII char to its ASCII int value?
投票最多的答案 () 将解决方案表述为:
只需这样做:
int(k)
但是我对此有疑问。
我的代码是:
std::cout << char(144) << std::endl;
std::cout << (int)(char(144)) << std::endl;
std::cout << int('É') << std::endl;
现在输出为:
É
-112
-55
现在我可以理解第一行了,但是第二行和第三行发生了什么?
首先,一些 ASCII 怎么可能是负数,其次,对于同一个字符,它怎么可能不同。
此外,据我测试,这不是内存中的一些随机垃圾,因为每次我 运行 程序都保持不变:
如果我将其更改为 145 :
æ
-111
据我猜测这可能是由于某种溢出导致的输出改变了 1。
但我无法准确地获取它,因为我正在转换为 int
,这应该足以(4 bytes
)存储结果。
任何人都可以提出解决方案吗?
如果您的平台使用 ASCII 作为字符编码(目前大多数平台都使用),请记住 ASCII 只是 7 位编码。
碰巧 char
是您平台上的 signed
类型。 (char
的符号与否对于 ASCII 无关紧要,因为只需要前 7 位。)
因此 char(144)
给你一个 char
,值为 -112。 (您的平台上有一个 2 的补码 char
类型:从 C++14 开始您可以假设,但在 C 中不能)。
第三行表示该字符(不在 ASCII 集中)的值为 -55
。
int(unsigned char('É'))
会迫使它在除了最奇特的平台之外的所有平台上都为正值。
C++标准只保证基本执行字符集1中的字符具有非负编码。该基本集之外的字符可能具有负编码 - 这取决于语言环境。
- 大写和小写拉丁字母表、十进制数字、大多数标点符号以及制表符、换行符、换页符等控制字符。
我看到了这个问题:How to convert an ASCII char to its ASCII int value?
投票最多的答案 () 将解决方案表述为:
只需这样做:
int(k)
但是我对此有疑问。
我的代码是:
std::cout << char(144) << std::endl;
std::cout << (int)(char(144)) << std::endl;
std::cout << int('É') << std::endl;
现在输出为:
É
-112
-55
现在我可以理解第一行了,但是第二行和第三行发生了什么?
首先,一些 ASCII 怎么可能是负数,其次,对于同一个字符,它怎么可能不同。
此外,据我测试,这不是内存中的一些随机垃圾,因为每次我 运行 程序都保持不变:
如果我将其更改为 145 :
æ
-111
据我猜测这可能是由于某种溢出导致的输出改变了 1。
但我无法准确地获取它,因为我正在转换为 int
,这应该足以(4 bytes
)存储结果。
任何人都可以提出解决方案吗?
如果您的平台使用 ASCII 作为字符编码(目前大多数平台都使用),请记住 ASCII 只是 7 位编码。
碰巧 char
是您平台上的 signed
类型。 (char
的符号与否对于 ASCII 无关紧要,因为只需要前 7 位。)
因此 char(144)
给你一个 char
,值为 -112。 (您的平台上有一个 2 的补码 char
类型:从 C++14 开始您可以假设,但在 C 中不能)。
第三行表示该字符(不在 ASCII 集中)的值为 -55
。
int(unsigned char('É'))
会迫使它在除了最奇特的平台之外的所有平台上都为正值。
C++标准只保证基本执行字符集1中的字符具有非负编码。该基本集之外的字符可能具有负编码 - 这取决于语言环境。
- 大写和小写拉丁字母表、十进制数字、大多数标点符号以及制表符、换行符、换页符等控制字符。