首页 > 解决方案 > 在 C++ 中将 int 转换为 char 时“缩小”如何工作?

问题描述

我是 C++ 的初学者,有一个关于转换的问题。将 int 转换为 char 值时,当 ASCII 表上超过 127 时会发生什么?

例如,


using namespace std;

int main()
{
double d = 0;
while (cin>>d){
  int i = d;
  char c = i;
  int i2 = c;

  cout<<"d=="<<d<<endl;
  cout<<"i=="<<i<<endl;
  cout<<"c=="<<c<<endl;
  cout<<"i2=="<<i2<<endl;
  cout<<"char:("<<c<<")"<<endl;
}
}

现在如果使用输入 150,当 i = d 时 i 变为 150,当 c = i 时 c 变为 û,这对我来说意味着 int 150 = char û

但是当 int i2 在屏幕上输出时,假设 int i2 将 char c 转换回整数,i2 == 106

我的假设是 int i2 也是 150。

如果有人可以向我解释这一点,我将不胜感激,因为我正在努力掌握这个概念。我读过,因为 char 可以保存 1 个字节的信息,而 int 可以保存 4 个字节的信息,所以该值是“缩小的”。但是,我不完全确定这意味着什么!

标签: c++

解决方案


在 C++ 中将 int 转换为 char 时“缩小”如何工作?

整数类型的宽度大致是它包含的字节数(或位数)。因此,如果一种类型具有较少的字节(或位),则它比另一种类型更窄。

考虑一个物理表现int——它是一张索引卡,上面标有八个盒子,我们可以在每个盒子里写一个数字。也许它会被其中一个自动光学系统读取,但无论如何,我们不允许在那里挤更多的数字或在盒子外面写。

现在,我们有一张代表 a 的等效卡片char- 它上面标记了两个框。

char卡也可以在物理上更窄,以真正打出类比,但重要的是您只能写两位数。

因此,以 10 为基数,一张int卡可以存储 0-99,999,999,而一张char可以存储 0-99。

现在,我给你一张写int有号码的卡片123,请你把数值复制到char卡片上。你能做什么?您可以丢弃不适合的百位数字,然后写23. 或者我猜你可以惊恐地举起双手拒绝。通常我们希望计算机做前者。

是一个狭窄的转换。char物理上太小(窄),无法容纳可以包含的所有信息int


最后,为了描述实际的intchar类型,我们可以使用二进制(在这种情况下,我们只能使用数字01int卡片有 32 个盒子,而char卡片有 8 个),或者我们可以让索引卡片保持相同的大小如果我们以 16 为基数而不是 10 为基数写我们的数字。

有符号还有一个更复杂的问题int,因此我们还需要用固定位数表示负值。char 可以签名或未签名 - 它取决于实现。如果您有兴趣,可以查找二的补码,这是存储有符号值的最常见方式,但通常您可以存储的值的一半将是负数。

粗略地说,缩小转换可能做错事的两种方式是:

  1. 较窄的类型只是没有足够的数字,所以有些被切断了
  2. 较窄的类型可以适合所有数字,但有符号,并且该特定模式表示窄类型中的负数(假设它在宽类型中为正)

推荐阅读