在int到char转换期间,int要大于存储在char中,如果int太大,将存储在char中的值是多少?

时间:2017-12-22 15:44:55

标签: c++

   double d=0;
   while(cin>>d){
       int i=d;    
       char c=i;   
       int i2=c;  
       cout<<"d=="<<d
           <<"i=="<<i
           <<"i2=="<<i2
           <<" char("<<c<<")\n";
}

我正在阅读使用C ++第2版的编程原理和实践。我处于安全和不安全的转换主题。给出的代码是一个练习,当运行时,我输入1000,然后输出

d==1000i==1000i2==-24 char(Φ)

我想知道当int太大而无法存储时,机器会做什么,就像1000变成了-24。

1 个答案:

答案 0 :(得分:5)

  

在int到char转换期间,int要大于存储在char中,将存储在char中的值是什么

取决于。

具体而言,取决于char类型是签名还是未签名。 char是否已签名,是否已实现实施。

如果char是无符号的,则结果值是最小无符号值,等于源模2 n ,其中n是char中的位数。

如果char已签名,则结果值是实现定义的。这意味着该值可以是char可表示的任何值。在 practice 中,在将负数表示为二进制补码(并且大多数处理器使用二进制补码)的系统上,通常相同的模数关系适用于有符号类型,如好。但是C ++标准并不能保证这一点。

由此,我们可以推断出char已在您的系统上签名,因为-24无法通过无符号类型表示。 -24确实与1000 modulo 2 8

一致

标准参考:[conv.integral]

  

2如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2n,其中n是用于表示无符号类型的位数)。   [注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断)。    - 结束说明]

     

3如果目标类型已签名,则该值如果可以在目标类型中表示,则不会更改;否则,该值是实现定义的。