【问题标题】:How does "narrowing" work when converting int to char in C++?在 C++ 中将 int 转换为 char 时“缩小”如何工作?
【发布时间】:2020-07-16 19:13:37
【问题描述】:

我是 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 个字节的信息,所以该值是“缩小的”。不过,我不完全确定这意味着什么!

【问题讨论】:

  • int 默认为signed intchar 默认为 unsigned char。这意味着 int 也可以显示负值,而 char 只能显示最大为 255 的正整数。当您将 int 显式声明为 unsigned int 时,该值保持不变(只要您不超过 255)。
  • @Sunburst275 -- char 可以是有符号或无符号的;这取决于实施。没有默认值。
  • @PeteBecker 没错,但这适用于每种数据类型,不是吗?例如,int 在一个系统上可能是 4 个字节,但在另一个系统上可能是 8 个字节。据我所知,Windows 隐含地将char 声明为unsigned char,还是我错了?
  • @Sunburst275 -- 这与问题相去甚远,所以我们不要在这里讨论char 的签名。问一个问题!
  • @PeteBecker 是的,请原谅我

标签: c++


【解决方案1】:

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

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

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

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

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

因此,在 base 10 中,int 卡可以存储 0-99,999,999,char 可以存储 0-99。

现在,我给你一张int 卡,上面写着123,并要求你将值复制到char 卡上。你能做什么?您可以丢弃不适合的百位,直接写23。或者我想你可以惊恐地举起双手拒绝。通常我们希望计算机做前者。

是缩小转化。 char 在物理上太小(太窄),无法容纳 int 可以包含的所有信息。


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

int 是有符号的,因此我们还需要用固定位数表示负值。 char 可能有符号或无符号 - 它取决于实现。如果您有兴趣,可以查找 two's 补码,这是存储有符号值的最常见方式,但通常您可以存储的值的一半是负数。 p>

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

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

【讨论】:

  • 哇!我感谢您的回答和您的类比!这非常有帮助,感谢您花时间彻底回答我的问题!保重!
猜你喜欢
  • 2017-11-21
  • 2012-06-04
  • 2015-07-11
  • 1970-01-01
  • 2020-05-20
  • 2011-03-31
  • 2017-01-18
  • 2014-02-07
  • 2013-08-10
相关资源
最近更新 更多