简单的C ++类型转换程序

时间:2014-10-23 02:35:04

标签: c++ ascii

我正在学习C ++,我正在讨论安全和不安全的转换问题。这是我的代码:

#include <iostream>

using namespace std;
int main()
{
    double d = 0;
    while( cin >> d )
    {
           int i = d; // try to squeez in a double into an int
           char c = i; // try to squeez in an int into a char
           int i2 = c; // try to get the integer value of the char

           cout << "d == " << d << "\n"
                << "i == " << i << "\n"
                << "c == " << c << "\n"
                << "i2 == " << i2 << "\n";
    }
    return 0;
}

当我输入3时,我得到以下内容:

d == 3
i == 3
c == a heart shape
i2 == 3

为什么c打印出这样的听觉形状:link

5 个答案:

答案 0 :(得分:1)

因为心脏字符是ASCII表的PC版本中值为3的符号。这是一个列表:http://www.ascii-codes.com/。假设您的程序在该环境中运行,您可能会在其中找到其他很好的代码。

答案 1 :(得分:1)

虽然char是整数类型,但ostreamcout的类型)将其视为特殊。它将其打印为单个字符而不是数字。

如果您不想这样,只需通过写int(c)而不是c“强制”将其打印为数字。

当您开始提出有关安全和不安全转化的问题时,我会添加评论:int(c)(int)c不同,您也会经常看到这些评论(遗憾的是) )。在这种情况下(使用int)它具有相同的效果,但它具有不同的语义。第一个构造了现有int值的char值。第二个是使用C风格的的不安全转换,这应该在C ++中避免,因为它可以杀死你首先使用C ++获得的所有类型安全性。

答案 2 :(得分:1)

从i到c分配的值3被截断为字符的宽度。然后它表示ascii字符Ctrl-C或ETX,(0x03),它通常不是可打印字符。但是,许多终端类型无论如何都会尝试打印。根据您的终端,它可能会打印为心脏。在不知道终端的字符编码及其设置的情况下,很难确切地说出它为什么打印成心形。

答案 3 :(得分:0)

对于&#39; d&#39;,您正在输出一个double,它将转换为表示二进制格式的double内容的字符串。整数(你的i和i2)也是如此。

将char发送到屏幕而不进行转换,即以其发送。 Char 3,如果你在ASCII表中查找,并不真正代表任何东西 - 可打印的字符从32开始。所以,你会得到一个很奇怪的&#34;字符。

答案 4 :(得分:0)

您正在看到由值为'3'的字符表示的不可打印字符的呈现。

在您的代码中,变量c的值为3.这实际上是ASCII集中的“非打印控制字符”。 (字符'3'是ASCII 33)。

在尝试打印时,它具有心脏符号的表示。