【问题标题】:How do char and int work in C++char 和 int 如何在 C++ 中工作
【发布时间】:2015-06-04 14:59:22
【问题描述】:

我可能会问一个愚蠢的问题,但我想确认 char 是如何工作的?让我用例子解释我想问的问题。 假设我声明了一个char variable,然后是input 6 或任何整数字符。

#include <iostream>
using namespace std;
int main(){
    char a;
    cin >> a;
    cout << a*a; // I know here input's ASCII value will multiply
    return 0;
}

与整数input 6相同

#include <iostream>
using namespace std;
int main(){
    int a;
    cin >> a;
    cout << a*a; // Why compiler not take input's ASCII Value here?
    return 0;
}

我想现在我的问题很清楚了。

【问题讨论】:

  • 我知道这里输入的二进制会成倍增长你这是什么意思?
  • 你能再解释一下你在问什么吗?
  • “我想现在我的问题很清楚了。” 走开。基本上你问的是"uint8_t can't be printed with cout"的反面,仍然可以应用强制转换。
  • @AlanWolfe 抱歉,我错误地写了二进制而不是 ASCII... 问题已更新。

标签: c++ char integer int


【解决方案1】:

char 是一种基本数据类型,大小为 1 字节(不一定是 8 位!!!),至少能够表示所有字符中的 ASCII code range。因此,例如,char x = 'a'; 确实存储了 'a' 的 ASCII 值,在本例中为 97。但是,ostream 运算符被重载,因此它们“知道”如何处理 char,而不是盲目地显示97 在类似cout &lt;&lt; x; 的行中显示字符的ASCII 表示,即'a'

但是,无论何时执行a * a,编译器都会执行所谓的integral promotion,并将char 中的数据隐式转换为int。所以,对于编译器来说,表达式a * a被翻译成(int)a * (int)a,这是97 * 97的结果,所以你最终会显示9409

请注意,对于编译器,charint 是两种不同的类型。它可以区分两者。因此,operator&lt;&lt; 仅在输入为 char 类型或可隐式转换为 char 的类型时才显示字符。

【讨论】:

  • 我已经知道这个过程了。但是编译器如何处理 char 和 int 呢?编译器是否将两者存储在不同的位置?我真的对 char 和 int 进程感到困惑。对不起
  • 我从您的积分推广链接中得到了有用的信息。特别是,算术运算符不接受小于 int 的类型作为参数我认为算术运算符现在很清楚了仅适用于大于或等于 int 的数据类型。编译器自动使用小于 int 的数据类型的 ASCII 值?
  • @AsifMushtaq 例如,在我的机器上,short 是 2 个字节,小于 int,即 4。但是 cout &lt;&lt; (short)x; 显示的是 ASCII 码,而不是字符。而cout &lt;&lt; (uint8_t)x; 显示对应于ASCII 码的字符,因为uint8_t 可以转换为char
【解决方案2】:

char 的情况下,被相乘的不是二进制,而是您输入的任何内容的ASCII 值。在6 的情况下,ASCII 值是54,所以2916是输出。当aint时,直接存储6,所以输出36

【讨论】:

  • 对不起,我写错了二进制而不是ASCII.... -_- 但是你说的int,6直接存储是什么意思?
【解决方案3】:

int 的情况下,它会将您输入的数字读取为数值而不是其 ASCII 值。因此,您只能将数字用于整数,但是 char 允许您使用任何字符(例如 A、B、C、D | 1,2,3,4 | ! #%^) 并且它使用它的 ASCII 值。例如 4 的 ASCII 值是 52,A、* 的 ASCII 值分别是 65 和 42。 注意:大写字母与小写字母不同(例如 S = 83,反之 s = 115)。

希望这会有所帮助。

【讨论】:

    【解决方案4】:

    这是因为隐式类型转换:

    每当某种类型的表达式时,都会执行隐式转换 T1 用于不接受该类型的上下文,但接受一些 其他类型T2,特别是:

    当表达式用作带有运算符的操作数时 预计 T2

    在你的例子中

    char a;
    cin >> a;
    cout << a*a; /
    

    运算符 * 需要一个整数类型,所以类型char 隐式转换为int,因此在将char 转换为int 时,系统使用char 对应的ASCII 值。请在此处查看更多详细信息http://en.cppreference.com/w/cpp/language/implicit_cast

    【讨论】:

      猜你喜欢
      • 2015-09-07
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      • 2014-02-20
      • 2020-05-20
      • 1970-01-01
      相关资源
      最近更新 更多