【问题标题】:During int to char conversion where int is to large to be stored in char, what will be the values that will be stored in char if int is too large?在 int 到 char 转换期间 int 太大而无法存储在 char 中,如果 int 太大,将存储在 char 中的值是多少?
【发布时间】:2018-06-05 06:12:40
【问题描述】:
   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";
}

我正在阅读 Programming Principles and Practice Using C++ 2nd Edition。我在安全和不安全的转换主题。给出的代码是一个练习,运行时我输入1000,然后输出

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

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

【问题讨论】:

  • 1024是256的倍数,也就是2^8,一个char往往是8位。 1000 少 24,所以 -24 == 1000 模 256。
  • 对于常规字符,字符的值为 1024%127,对于无符号字符,其值为 1024%256。虽然这被认为是不好的做法
  • @Jake 对于非unsigned chars,没有明确的值;它充其量是定义的实现。如果你看到了结果1024%127,那是你的实现细节。
  • @underscore_d 我很抱歉这是 % 128
  • @JakeFreeman 再次阅读我的 cmets。恕我直言,一种实现方式非常无趣。那就是:仅仅因为你的实现返回一个特定的结果并不意味着标准要求它,或者编写依赖于该结果的代码在不同的系统上编译时不会严重破坏。

标签: c++


【解决方案1】:

在 int 到 char 转换期间 int 太大而无法存储在 char 中,将存储在 char 中的值是什么

视情况而定。

尤其取决于char 类型是有符号还是无符号。 char 是否签名,是实现定义的。

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

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

由此,我们可以推断char 在您的系统上已签名,因为-24 不能用无符号类型表示。 -24 确实与 1000 模 2 一致8


标准参考:[conv.integral]

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

3 如果目标类型是有符号的,如果可以在目标类型中表示,则值不变;否则,该值是实现定义的。

【讨论】:

  • 另外,还可以添加标准中的引用(第 7.8.2-7.8.3 节关于整数转换)。
  • @Kimley • 如果您发现答案的模糊性令人不满意,那是因为 C 和 C++ 是试图通过不施加次优约束来勉强实现平台所有可能性能的语言一些平台。这是促成 C 和 C++ 学习曲线的原因之一,并使编写真正可移植的 C/C++ 代码更具挑战性。
猜你喜欢
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
相关资源
最近更新 更多