【问题标题】:Why does a char casted to an int not equal the original char?为什么转换为 int 的 char 不等于原始 char?
【发布时间】:2020-12-23 04:17:15
【问题描述】:

为什么存储在int 中的已转换char c 与原始char 不同?

我到处寻找解释,但我似乎无法将 char 存储在 int 中并能够将其与另一个 int 进行比较。

#include <iostream>
using namespace std;

int main() {

    char c = 255;
    int x = (int)c;
    cout << (x == 255) << endl;

    return 0;
}

这会输出0。为什么?

【问题讨论】:

  • (c &lt; 0) 的结果是什么?或者如果你#include &lt;limits&gt;,你会得到std::numeric_limits&lt;char&gt;::max() 什么?
  • x == cx == (char)255 将评估为 true,因为默认整数促销。但是x == 255char 签名的机器上转换为-1 == 255
  • cout &lt;&lt; (c &lt; 0) &lt;&lt; endl; 输出1。这对我来说没有多大意义。
  • 我知道x == cx == (char)255 将相等,但我想知道为什么在将c 转换为int 并将其与另一个int (如255)进行比较之后将返回 false。
  • 因为11111111 != 11111111111111111111111111111111 char 是(有符号的),当转换为int 时,该值被符号扩展为32位。

标签: c++ types type-conversion


【解决方案1】:

演员不是这里的问题。试图将 255 分配到一个 8 位有符号 类型的 char 中。这很可能导致所有位都被设置,并被解释为 -1,但你不应该首先这样做。尝试使用 127 或更低,它会打印 1。

【讨论】:

  • 请注意,char 是有符号还是无符号是实现定义的。
  • @Eugene,理论上是正确的。不过,给我看一个实际的编译器,但情况并非如此。我准备在这里打赌它是 8 位有符号值,也准备在 255 上打赌相当高的金额,只是被加载到位中并成为-1.
  • 是的,就是这样。将类型切换为 unsigned char 是解决方法。
  • 好的,char 未签名的一个实际编译器是 gcc。 (如果目标架构是 ARM,仅此一种情况。)
猜你喜欢
  • 1970-01-01
  • 2013-10-05
  • 2017-03-21
  • 2013-01-19
  • 2010-12-01
  • 2011-11-20
  • 1970-01-01
  • 2015-01-05
  • 2023-01-06
相关资源
最近更新 更多