在 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中的字符具有非负编码。该基本集之外的字符可能具有负编码 - 这取决于语言环境。


  1. 大写和小写拉丁字母表、十进制数字、大多数标点符号以及制表符、换行符、换页符等控制字符。