简单的C++类型转换程序
Simple C++ type conversion program
我正在学习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
打印出这样的听觉形状:链接
因为心形字符是 PC 版 ASCII 表中值为 3 的符号。 这是一个列表: http://www.ascii-codes.com/. 你可能会发现其他很好的代码在那里,假设你的程序在那个环境中运行。
从 i 到 c 分配的值 3 被截断为字符的宽度。然后,它表示 ascii 字符 Ctrl-C 或 ETX (0x03(,它通常不是可打印字符。但是,许多终端类型无论如何都会尝试打印某些内容。根据您的终端,它可能会打印为心形。如果不知道终端的字符编码及其设置,就很难确切地说出为什么它打印为心形。
虽然char
是整数类型,但ostream
(cout
的类型(将其视为特殊。它将其打印为单个字符而不是数字。
如果您不希望这样做,只需通过写int(c)
而不是c
来"强制"将其打印为数字。
当您以有关安全和不安全转换的问题开始提问时,我将添加一条评论:int(c)
与(int)c
不同,您也会经常看到(可悲的是(。在这种情况下(使用int
(,它具有相同的效果,但具有不同的语义。第一个从现有的char
值构造一个int
值。第二种是使用 C 样式强制转换的不安全转换,这应该在C++中避免,因为它会首先杀死您通过 C++ 获得的所有类型安全性。
对于"d",您将输出一个双精度,该双精度值将转换为以二进制格式表示双精度值内容的字符串。整数(您的 i 和 i2(也会发生同样的情况。
字符被发送到屏幕而不被转换,即被发送。Char 3,如果你在 ASCII 表中查找,并不真正代表任何东西 - 可打印的字符从 32 开始。所以,你会得到一个"奇怪"的角色。
您看到的不可打印字符的呈现由值"3"的字符表示。
在代码中,变量 c 的值为 3。 这实际上是 ASCII 集中的"非打印控制字符"。 (字符"3"是 ASCII 33(。
它在尝试打印时具有心形符号的表示形式。
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- C++:用户定义的显式类型转换函数错误
- 将类指针类型转换为键时出错
- 通过引用传递参数时C++类型转换
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- C++无效的函数类型转换
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何将Windows产品类型转换为名称?
- 我的程序返回整数值,但即使在显式类型转换之后也应该给出双值
- C++简单的矢量程序中从 int 类型转换为非标量类型
- 程序计算、类型转换错误
- 简单的C++类型转换程序