【问题标题】:Error in getting ASCII of character in C++在 C++ 中获取字符的 ASCII 时出错
【发布时间】:2021-05-14 10:37:15
【问题描述】:

我看到了这个问题:How to convert an ASCII char to its ASCII int value?

投票最多的答案 (https://stackoverflow.com/a/15999291/14911094) 将解决方案表述为:

这样做:

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) 来存储结果。

任何人都可以提出解决方案吗?

【问题讨论】:

  • 我认为使用 unsigned char 会起作用,它最多有 255 个
  • 首先,AFAIK ASCII 仅定义为从 32 到 127。其他任何东西都不是 ASCII。在您的情况下,char 类型是一字节有符号类型。 IE。它可以保持值-127..128。因此,当您执行 char(144) 时,它存储为 -112,而当您执行 (int) 时,它只是将单字节 int 转换为 C int 而无需进行符号转换。 PS:int('É') 的值可能与 144 不同,因为您的源代码使用与终端不同的编码进行编码,可能是 UTF-8。
  • @debanshudas:这是 C 和 C++ 标准允许的最小最大值。
  • @sklott:字符 0 到 31 也用 ASCII 定义。
  • @sklott • ASCII 127 不是显示字符。

标签: c++ integer character ascii


【解决方案1】:

如果您的平台使用 ASCII 进行字符编码(现在大多数情况下),那么请记住 ASCII 是 7 位编码。

碰巧char 是您平台上的signed 类型。 (char 的符号与否对于 ASCII 无关紧要,因为只需要前 7 位。)

因此char(144) 给你一个char,其值为-112。 (你的平台上有一个 2 的补码 char 类型:从 C++14 开始你可以假设,但你不能在 C 中)。

第三行表示该字符(不在 ASCII 集中)的值为-55

int(unsigned char('É'))

会迫使它在除最奇特的平台之外的所有平台上获得正值。

【讨论】:

    【解决方案2】:

    C++ 标准仅保证基本执行字符集1 中的字符具有非负编码。该基本集之外的字符可能具有负编码 - 这取决于语言环境。


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

    【讨论】:

      猜你喜欢
      • 2017-09-08
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多