【问题标题】:Explain the output — I don't understand how the value of i will be changed [duplicate]解释输出——我不明白 i 的值将如何改变 [重复]
【发布时间】:2018-04-01 07:11:46
【问题描述】:
/*how will the value of i be changed in output*/

void main()
{
    int i = 150;
    char c = i;
    i = c;
    printf("%d", i);
}

【问题讨论】:

  • i 的值将如何变化..?
  • 编辑问题,而不是留下有其他问题或信息的 cmets。见How to Ask。还要编辑您的问题以确保正确使用标签,并且您看到的输出示例将有助于其他尝试回答您的问题的人。
  • 没有重复?没时间挖一些自动取款机。

标签: c operators


【解决方案1】:

因为char 只能保存一个字节的数据,-128 到 127,所以在其中存储一个 150 的值会导致符号溢出,给出否定的结果。

符号溢出会导致未定义的行为,然而,经常发生的是:

直到最大正值 127,一切正常。

分配 128 时,符号位被设置并且报告的值翻转为 -128。

每超过这个值 1,这个值也会增加。

因此,在您分配 150 的情况下,在 128 位翻转,并且您还剩下 22 个 (150 - 128),因此最终值可能是 -106 (-128 + 22)。

事实上,如果我尝试使用 Visual Studio,这就是我在 Windows 上得到的结果。但同样,这是未定义的行为,因此无法保证当符号位溢出时系统会做什么。

【讨论】:

  • 以及如何计算否定结果?或签署溢出工作?
  • 标准规定普通的charsigned charunsigned char 具有相同的范围,但与两者不同。如果普通的char 类型与signed char 具有相同的范围,则提到的范围是正常范围,但不必如此。 OTOH,如果不是这样,这个问题可能不会被问到。
  • 谢谢,我注意到char 可以签名或未签名,但找不到与此相关的任何其他具体信息。
  • 这里没有未定义的行为。 超出范围赋值不是溢出的情况。溢出是指算术运算的结果将超出结果类型的界限。此外,一些系统的char 为 0-255,甚至更大的范围,实际上可能存在更多这样的系统。
猜你喜欢
  • 2020-07-08
  • 2019-09-22
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多