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。
答案 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如果目标类型已签名,则该值如果可以在目标类型中表示,则不会更改;否则,该值是实现定义的。